ということで、
前回の続きから、時限式信号動作スクリプトです。まず動作の説明をします。
編成の先頭車両がセンサーを通過するとその時点での信号の色に応じて、編成のMethodRedSignal、MethodYellowSignal、MethodGreenSignalを呼び出します。なので、編成内のそれぞれのメソッドに動作を書いておけば、編成は信号に応じた動作をします。また、この時点で信号の色はホールドされます。次にその編成の最後尾車両がセンサーを通過すると、設定時間分赤信号になり、次に設定時間分黄信号になり、そして青信号になります。
という感じです。それでは早速。
−−−*−−−*−−−*−−−
まず、センサーのスクリプトは、
//----------------------------------------------------------------------
//3灯式信号センサースクリプトSignalSensor01
//----------------------------------------------------------------------
//変数宣言
VarTrain ObjTrain
Var SensorEventID
Var AfterEventID
Var VarSignalFlag
Var VarSensorModeFlag
//スタート
//0 すべてのランプOFF(起動直後)、1 停止、3 注意、6 進行
set VarSignalFlag 6
SetSensorMode 0
SetEventSensor MethodSensorEvent SensorEventID
//メソッド
//センサーイベント
BeginFunc MethodSensorEvent
GetSenseTrain ObjTrain
//センサーモード取得
GetSensorMode VarSensorModeFlag
//センサーモード0つまり対象編成が信号に近づいた時なら
ifzero VarSensorModeFlag
//赤信号なら編成のMethodRedSignal実行
ifeq VarSignalFlag 1
KillEvent AfterEventID
call ObjTrain MethodRedSignal
endif
//黄信号なら編成のMethodYellowSignal実行
ifeq VarSignalFlag 3
KillEvent AfterEventID
call ObjTrain MethodYellowSignal
endif
//青信号なら編成のMethodGreenSignal実行
ifeq VarSignalFlag 6
KillEvent AfterEventID
call ObjTrain MethodGreenSignal
endif
//センサーモード1にして対象編成の通過を取得へ
SetSensorMode 1
else
//センサーモード1つまり対象編成が通過した時なら時限式信号メソッドへ
call this MethodSensorEvent1
endif
EndFunc
//時限式信号メソッド
BeginFunc MethodSensorEvent1
SetSensorMode 0
set VarSignalFlag 1
//通過後の赤信号の点灯時間
SetEventAfter this MethodSensorEvent2 AfterEventID 10000
EndFunc
BeginFunc MethodSensorEvent2
set VarSignalFlag 3
//赤信号後の黄信号の点灯時間
SetEventAfter this MethodSensorEvent3 AfterEventID 10000
EndFunc
BeginFunc MethodSensorEvent3
set VarSignalFlag 6
EndFunc
で、赤い文字の部分が、赤信号と黄信号の点灯時間なので、時間を変更する場合にはこの値を変更してください。
SetEventAfter等の時間の部分に変数が使えればもっと調整は楽になるんですけどね。これのせいで、時限式を諦めたという理由もありますわ。
次に信号機のスクリプトは、
//----------------------------------------------------------------------
//信号機スクリプトSignal01
//----------------------------------------------------------------------
//変数宣言
VarSensor ObjSensor
Var TimerEventID
Var VarSignalFlag
//スタート
//対象センサー入力
get ObjSensor "SignalSensor01"
//1秒おきに状態を確認
SetEventTimer this MethodSensorEvent TimerEventID 1000
//メソッド
BeginFunc MethodSensorEvent
mov this VarSignalFlag ObjSensor VarSignalFlag
SetSignal VarSignalFlag
EndFunc
で、赤い文字の部分に対象となるセンサー名を記述してください。黄色い文字の部分ではあまり負荷をかけない為にタイマーを1秒間毎にセットしているので多少ギャップがあります。このギャップが気になる方は値を小さくしてください。
最後に、編成のスクリプトは、
//----------------------------------------------------------------------
//編成スクリプト
//----------------------------------------------------------------------
//変数宣言
//スタート
SetVoltage 0.7
//メソッド
//赤信号時のメソッド
BeginFunc MethodRedSignal
SetVoltage 0.3
EndFunc
//黄信号時のメソッド
BeginFunc MethodYellowSignal
SetVoltage 0.5
EndFunc
//青信号時のメソッド
BeginFunc MethodGreenSignal
SetVoltage 0.7
EndFunc
で、赤い文字の部分を自分の考える設定で書き換えてください。今はテキトーに電圧を変えるだけにしていますが。
−−−*−−−*−−−*−−−
さて、この「時限式信号動作スクリプト」。既にお解りの方もいらっしゃるでしょうが、ghost氏がVRM入道「
オブジェクト参照の方向非対称性について」にて提唱された「
アドオン記法」になっています。なので、信号機が無くてもセンサーだけで動作しちゃうんですねぇ〜。
別に最初から「アドオン記法」を狙っていた訳ではないんですよ。時限式速度調整センサーがまずありきで考えていて、「ああ、それなら信号機で表示させた方がビューワー上で識別できてイイんじゃね?」と後から信号機の設定を付加したので、自然とこうなっていたという感じです。つまり、
「信号機なんてただの飾りです。偉い人にはそれがわからんのですよ。」
という考え方をしていると、自然と「アドオン記法」になっちゃう訳で、「アドオン記法」は別に難しい考え方ではない、というか、後から他のオブジェクトを付け加え易いので、長い目で見ると反って楽ということですよ。タイマー使って対象オブジェクトの状態を把握して動作するだけの話ですから。まぁ、あまりこればっかりに頼っているとビューワーの処理速度を低下させかねないですが。

0