2006/10/29

【何か】シリーズを作ってみよう(その13)  【何か】スクロール
前回へ戻る>

今回は、前回示したメソッドsubStopから(SetEventZeroSpeed命令で設定される)停車イベントによってcallされるメソッドsubStopped以降、編成を再出発させるまでの流れを解説します。この一連の流れでは、以下のことをおこないます。

(1) 停車してから一定時間待つ。
(2) グローバル変数VarFlagの値が1であれば方向転換する。
(3) さらに一定時間待つ。
(4) 再出発する。

メソッドの中身に入る前に、上掲下線部の「一定時間」を得るべく、paramセクションを1つ追加しておくことにしましょう。

param
{
name WizStopTime
type int
default 2500
range 1000 30000
guide "停車時間の半分(単位ミリ秒)。停車後、この時間が経過すると方向転換がおこなわれ、さらに同じだけ時間が経過すると出発する。"
}

paramセクションの書き方についてはこちらで解説しているので参照してください。“WizStopTime”という名前で1000〜30000(1秒から30秒に相当)の数値をSCRIPTウィザードから受け取る、という意味になります。以前の「編成の加減速性能」の場合と異なり、VRMスクリプトの世界では時間は単位ミリ秒の整数扱いですので、type要素は“int”になります。

ここで受け取ったWizStopTimeを使って、(1)〜(4)の処理をおこなうメソッドを以下に示します。

BeginFunc subStopped
//
//停車メソッド
//
//停車イベント解除
KillEvent IDtimer
//WizStopTimeミリ秒後に方向転換
SetEventAfter this subTurn IDtimer WizStopTime
EndFunc

BeginFunc subTurn
//
//方向転換メソッド
//
//方向転換
if VarFlag
Turn
endif
//WizStopTimeミリ秒後に出発
SetEventAfter this subDeparture IDtimer WizStopTime
EndFunc

BeginFunc subDeparture
//
//再出発メソッド
//
//減速前の速度まで、減速に要した時間をつかって加速する
SetTimerVoltage VarStartVoltage VarStartTime
EndFunc

わかりやすいように、WizStopTimeの部分を黄色にしてみました。これが二箇所あることは、先に示した(1)〜(4)の中で「一定時間」が二回出てくることと対応しています。では、例によって一行ずつ何をしているのか見ていくことにしましょう。

メソッドsubStoppedで最初にやっていることは、“KillEvent”命令によって変数IDEventが示すイベントを無効化することです。SetEventZeroSpeed命令によって設定される停車イベントは、KillEvent命令によって明示的に解除するまでずっと有効になります。したがって、ここ(停車イベントでcallされたイベントの冒頭)でこれを無効化しないと、再発車以降、ユーザー操作で編成の速度が0になるたびに、メソッドsubStoppedが実行されることになります。これは、少なくとも今回のケースにおいては都合が悪いので、これを避けるべく、最初にイベントを無効化しているワケです。

続く“SetEventAfter”命令は「一定時間後に指定したメソッドをcallせよ」というお馴染みのヤツです。ここでは、WizStopTime(ミリ秒)後にthis(この編成)のメソッドsubTurnを実行せよ、の意になります。つまり、冒頭に示した処理(1)がこれです。ちなみに、SetEventAfterによって設定されるイベントは、SetEventZeroSpeed等のそれとは異なり、一度イベントが発動(指定したメソッドがcall)されると自動的に無効化されるため、これについては明示的にKillEventする必要はありません。

メソッドsubTurnは処理(2)と(3)をおこなう部分です。“if VarFlag”は、「変数VarFlagが0でなければendifまでの処理を実行せよ」という意味になります。つまり、ここで示した処理によってVarFlagに1が設定されていた場合のみ、続く“Turn”命令=方向転換が実行されることになります。VarFlagが0であれば、Turn命令は実行されないので、この駅停車は折り返しではない普通の停車になります。

そしてもう一度、SetEventAfter命令を使って、今度はWizStopTimeミリ秒後にメソッドsunDepartureをcallするようにイベント設定します。こうして見ると、VarFlagの値が0か1かを問わず、停車イベントの発動からメソッドsubDeparture(再発車メソッド)がcallされるまでには、WizStopTime×2ミリ秒が経過することがわかります。これが、冒頭に示したparamセクションのguide要素に「停車時間の半分」と書いた理由です。

最後に、メソッドsubDepartureですが、ここには“SetTimerVoltage”命令が1つあるだけです。前回示したメソッドsubStopが動作し終わった(停車のために減速し始めた)時点で、グローバル変数VarStartVoltageに減速開始直前の走行電圧が、VarStartTimeには停車に要する時間が代入されていたことを思い出してください。

“SetTimerVoltage VarStartVoltage VarStartTime”は「VarStartVoltageが示す速度まで、VarStartTimeミリ秒かけて加速せよ」という意味になりますから、これは「停車前の走行速度まで、停車に要した時間を使って加速せよ」と命じていることになります。つまり、停車したときとは丸々逆のことをすることで再発車させていることになります。

以上、ここまでがメソッドsubStopに始まる「停車→必要に応じて方向転換→再発車」をおこなう仕組みになります。常々申し上げていることではありますが、スクロール(魔法の巻物の意)という言葉とは裏腹に、魔法地味たことは一切なく、すべては小さな論理の積み重ねに過ぎません。初見で理解できなくとも、繰り返し短気を起こさずに読み込んでいただければ、必ずや仕組みがご理解いただけるものと思います。

次回は、オマケ機能の組込みを通してkeyセクションの使い方を解説し、この連載を終了します。

次回へつづく>
0

コメントを書く

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




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