2007/4/26

ゆゆぽん☆退避/追越列車とか作っちゃうかMona-(3)−追越列車と退避列車を判別する  VRMスクリプト禅問答
<<前回へ

いよいよ具体論に入ります。今回は課題(1)-1“追越列車と退避列車を判別する”についてです。なお、話を単純化するために、列車は原則一方通行(上下線完全分離)である前提で進めていきます。

まず、結論から。

[a] 走ってきた編成を判別する必要のある地点(このケースでは駅構内手前で分岐するポイント)の少し前にセンサーを配置する。
[b] 編成には、その編成の性格を示すグローバル変数(公開プロパティ)を用意しておく。このグローバル変数に代入される数値と、編成の性格(追越/退避列車のいずれか)を対応させる。
[c] センサーで編成を検知したら、前述のグローバル変数の値を取得する。
[d] センサーで取得した値を、その値を使って自身の動作を決定するオブジェクト(このケースでは分岐ポイント)に渡す。

[a]については、直感的にそうでなければならないことはご理解いただけると思いますので解説は省略します(詳述が必要であればコメント欄でリクエストしてください、以下同)。

今回の肝は[b]の部分です。ネットVRM界隈で交わされるVRMスクリプトのコードを見ていると、しばしばVarTrain命令で宣言されるところのTrain変数(編成オブジェクト変数)を比較することで、センサーが検知した編成の判別を試みているものを見受けます。これはお奨めできない手法です。理由は以前に書いたこちらを参照してください。

センサーが検知した編成を判別するには、オブジェクト名(編成名、厳密には編成オブジェクトへの参照)ではなく、レイアウト上の編成それぞれに事前に設定したグローバル変数を使う癖をつけておいた方が、何かと便利です。ミニマムな形でサンプルコードを示すと、以下のようになります。
[編成スクリプト]
//編成の性格を示すグローバル変数を宣言
Var VarType
set VarType {適当な数値}

[センサースクリプト]
//センサーイベントを設定
Var EvtSensor
SetEventSensor MtdSenseTrain EvtSensor
//編成検知時に実行されるメソッド
BeginFunc MtdSenseTrain
  VarTrain TmpTrain
  Var TmpType
//検知した編成オブジェクトを取得
  GetSenseTrain TmpTrain
//変数TmpTypeに検知した編成のVarTypeの値を取得
  mov TmpType TmpTrain.VarType
EndFunc
上掲サンプルコードのセンサースクリプトが先に箇条書きした[c]に当たります。たとえば、編成Aの{適当な数値}には100が、編成Bのそれには250が代入されていたとします。このとき、編成Aがセンサーを通過すると、ローカル変数TmpTypeには100が、編成Bが通過すると250が得られることになります。この変数TmpTypeをif系命令で判断すれば、編成を判別できることになります。

最後に[d]ですが、これは拙作gws/1.0規格自動運転スクロールでは採用していない方法論です(当該スクロールの解析を試みた方向けの言い訳)。スクロールの場合、オブジェクトへのスクリプトの流し込みはSCRIPTウィザードという(不備はあるものの)視覚的なGUIがやってくれるので、ここで言う判別処理が実際にどのオブジェクトでおこなわれるか、があまり問題になりません。これに対し、今回のケースは自分で手作業でスクリプトを書いて歩くことを想定しています。このような場合、たとえば、一旦動く仕組みを作り上げてから、その動作の一部に変更を加える事態を想定しておく価値があります。

事実、[b]はまさにそれを体現していて、編成スクリプト内のグローバル変数の値がその編成の性格を示している、ということは、すなわち、編成スクリプトのその値だけを変更すれば、このグローバル変数を判別して動作するところのすべてのオブジェクトの動作を変更できることに他なりません。つまり、編成がどこを走るか、を、それがどこに記述されているかを考えた場合に、直感的に判断しやすい編成スクリプトの一行に集約できる、というのが[b]の価値です。

同じ考え方からいくと(絶対にそうではなくてはならない、という性質のものではありませんが)、センサーが検知した編成から得たグローバル変数の値を判別する処理は、この値によって正/反位へ切替をおこなうポイントのポイントスクリプト内に書かれていた方が良いと言えます。つまり、そのポイントのスクリプトさえ変更すれば、どの編成(厳密には編成から得られる変数の値)を正位方向に向かわせ、どの編成を反位方向へ向かわせるのか修正できる、ということです。

具体的なスクリプト記述については、ポイント側の処理が絡んできますから、次回改めて解説することにします。

次回へ>>
0

コメントを書く

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




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