2006/11/4

発車を検知するイベントを作りたい  VRMスクリプト禅問答
久しぶりにこのシリーズのオリジナルスタイルで参りましょう。

【怎麼生】
編成が停車したタイミングで何かを起こすにはSetEventSpeedZero命令を使えば良いことは理解しました。では逆に、編成が出発したタイミングで何かを起こすにはどうすれば良いでしょうか?

【説破】 4.0.4.7
ここで紹介した方法を応用することで可能になります。

と、これで終わってしまってはあまりに乱暴なので、サンプルスクリプトを以下にしめします。

[編成スクリプト]
//グローバル変数宣言
Var IDDeparture //イベントID用変数

BeginFunc 出発待ち
//現在速度取得
Var TmpSpeed
GetCurrentSpeed TmpSpeed
//速度が0なら
ifzero TmpSpeed
SetEventAfter this 出発待ち IDDeparture 33
//速度が0でない=出発したなら
else
call {オブジェクト参照} {出発時に実行するメソッド}
endif
EndFunc



コメントがすべてを物語っていますが、サラッと中身を解説しておきます。要するに、GetCurrentSpeed命令で現在速度をローカル変数TmpSpeedに取得し、これが0、つまり停車中であればメソッド「出発待ち」=自分自身を33ミリ秒後に再実行し、0でない場合、つまり出発していれば{出発時に実行するメソッド}をcallする、という仕組みです。一旦else以下が実行されると、このときはSetEventAfter命令が実行されないことになりますから、メソッド「出発待ち」の繰り返し実行が止まることになります。

再実行までの待ち時間33ミリ秒は、まぁ、適当です。これは1/30秒に相当し、人間の目が「一瞬」だと錯覚するギリギリの時間の長さ、だと思ってください。これをあまり長くし過ぎると、いかにも「出発してから何かが起きる」ように見えます。とは言え、あまりに短くし過ぎると負荷が高くなりますから、このくらいが妥当かと思います。

使い方は、編成の停車中に「出発待ち」をcallするだけ。ビュワー起動時に出発待ち状態にしたいのであれば、

[編成スクリプト]
Var IDDeparture //イベントID用変数
SetEventAfter this 出発待ち IDDeparture 100

黄色で示したSetEventAfter命令を書き加えればOK。callで済まさないのは、ビュワーを起動した瞬間はGetCurrentSpeed命令で必ずしも正しい速度が得られない場合があるからです。これは、ここらへんに書いていることと根を同じくする話で、ビュワー起動直後に何かをさせる場合の定石です。待ち時間100ミリ秒は適当ですが、これで待ちが短すぎたという話は聞いたことがないので、まぁ大丈夫でしょう。

さらに、一旦ユーザーが編成を走行させてから停車した時点でこれを仕掛けたいのであれば

[編成スクリプト]
//グローバル変数
Var IDStop
SetEventZeroSpeed 出発待ち IDStop

としておけば、編成が停車した瞬間にメソッド「出発待ち」がcallされ、以降、速度が0でなくなる=出発するまで繰り返されることになります。

なお、一旦「出発待ち」が開始されてから、何らかの都合でこの待ちを解除したい場合、つまり、列車が出発しても{出発時に実行するメソッド}を実行する必要がなくなった場合は、 KillEvent IDDeparture を実行すれば、その時点で33ミリ秒以内に実行予定になっているイベントが解除され、出発待ちイベントが無効化されます。

最後にこの仕組みの応用例を1つ紹介しておきます。編成の運転台から見える位置に、“SIGNAL1”と名前をつけた信号部品を配置し、以下のスクリプトを書き込んでください。

[編成スクリプト]
Var IDDeparture
SetEventAfter this 出発待ち IDDeparture 100

BeginFunc 出発待ち
Var TmpSpeed
GetCurrentSpeed TmpSpeed
ifzero TmpSpeed
SetEventAfter this 出発待ち IDDeparture 33
else
call SIGNAL1 青信号
endif
EndFunc

[信号“SIGNAL1”スクリプト]
SetSignal 1

BeginFunc 青信号
SetSignal 6
EndFunc

編成を出発させると同時に、目前の信号機がG現示になります。鉄道の仕組みとしては因果関係が逆になりますが、お手軽に「出発進行!」気分を楽しむことが出来ます。
0

コメントを書く

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




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