2005/11/3

キーイベントをON/OFFする  VRMスクリプト禅問答
【怎麼生】
[s]キーを押したら列車が出発するスクリプトを書いたのですが、列車が出発した後でもう一度同じキーを押すと再び出発用の処理が実行されてしまって動作が変です。どうすればいいですか。

【説破】 4.0.2.4
解決策は2つあります。

(1)キーイベントが呼び出すメソッドの中で、自分が動作すべきかどうかを判断させる。
(2)ビュワー起動時にキーイベントを登録したままにせず、必要に応じて登録/解除をおこなう。

それぞれに一長一短があり、ニーズに応じて使い分けることをお奨めします。


(1)について、列車の出発を例にサンプルを示してみましょう。
[編成スクリプト]
//キーイベント設定
Var KeyIDs
SetEventKey this MtdPushS KeyIDs s
//
//sキーが押されたら実行されるメソッド
//
BeginFunc MtdPushS
Var Tmp
GetCurrentSpeed Tmp
ifzero Tmp
call this MtdDeparture
endif
EndFunc
//
//出発メソッド
//
BeginFunc MtdDeparture
//ここに出発のためのスクリプトを書く
EndFunc
このケースの場合、GetCurrentSpeed命令と、後に続くifzero命令が、キーイベントに紐付いた「出発メソッド」が動作すべきか否かの条件判断になっています。つまり、速度が0Km/hでないとメソッドMtdDepartureが実行されない、という具合に。
ただし、すべてのケースがこれで処理できるわけではありません。この方法が使えるのは、if系命令で判断が可能なケースに限られます。恣意的なフラグ変数を持ち込めば大抵のことは処理できますが、おそらくデバッグが面倒になるでしょう。
そこで、もう1つの方法ですが、たとえば以下のような感じです。
[編成スクリプト]
//キーイベント管理変数
Var KeyIDs
//初期設定
call this MtdSetPushS
//
//キーイベント設定メソッド
//
BeginFunc MtdSetPushS
SetEventKey this MtdGoandStop KeyIDs s
EndFunc
//
//少し前進するメソッド
//
BeginFunc MtdGoandStop
Var TimerID
KillEvent KeyIDs //イベントを削除してしまう
SetTimerVoltage 0.1 3000
SetEventAfter this MtdGoandStop2 TimerID 5000
EndFunc
//
//停車するメソッド
//
BeginFunc MtdGoandStop2
SetTimerVoltage 0.0 3000
EndFunc

[センサースクリプト]
//編成検知イベント設定
Var EventID
SetEventSensor MtdSenseTrain EventID
//
//編成検知イベント
//
BeginFunc MtdSenseTrain
Var TimerID
VarTrain ObjTrain
GetSenseTrain ObjTrain
call ObjTrain MtdGoandStop2 //3秒後に編成は速度0に
SetEventAfter ObjTrain MtdSetPushS TimerID 5000 //5秒後にキーイベントを再設定
EndFunc
上掲のサンプルコードは、[s]キーを押すと編成が少しだけ前進して止まる、というものです。もう1度[s]キーを押しても同じことはおこりません。そして、編成がセンサーに到ると編成は停止し、sキーの機能が再び有効になります。
この仕組みの基本的な考え方は以下のようなものになります。

1. キーイベントの設定(SetEventKey命令)をメソッドでおこなう。これは必須ではないが、外部から再設定する際に便利。
2. キーイベントが実行するメソッドの内部でそのイベント自身を無効化(KillEvent命令)する。これにより、キーイベントの意図しない再実行が防止される。
3. 再びキーイベントを設定したい条件(上掲サンプルでは編成がセンサーを踏んで停止すること)が整った時点でキーイベント設定メソッドをcallする。

ある程度以上に複雑なアクションを組み込む場合は、こちらの方法の方が任意の時点でキーイベントをON/OFFできるという点で有利です。冒頭にも書いたように(1)、(2)それぞれの方法には一長一短があるので、いろいろ試してみてください。

注)本連載で示すVRM4スクリプトや物の考え方をあなたが採用した結果生じる全ての事象については、その責を負い兼ねます。私の書いたものを読むに際しては、常に「コイツは狂人で、でも一部は役に立つことも言っているかも知れない」という程度の心構えで臨んでください。
0

コメントを書く

この記事にはコメントを投稿できません




teacup.ブログ “AutoPage”
AutoPage最新お知らせ