|
今回は単線の踏切を動作させます。
さて、複線踏切のセンサー配置を無理矢理単線に押し込むと以下のような形になります。
先回と同じく赤いコンテナが「閉める」センサー、青いコンテナが「開ける」センサーの位置を示しています
しかし、当然この配置だと踏切は正確に動作しません。
そこでセンサーを2つのグループに分けます。
センサーをコンテナ1段積みグループとコンテナ2段積みグループとに分けました。
まず、画面手前から奥へ走っていく列車を上り列車、その反対を下り列車と決めます。
そして上り列車が来たらコンテナ1段積みのセンサーのみ反応し、
下り列車が来たらコンテナ2段積みのセンサーのみが反応するようなスクリプトを組めば問題ないわけです。
今回のスクリプトのミソは「上り列車」と「下り列車」をセンサーに判別させることです。
しかし、センサーにはどちらの方向から列車が来たかというコトは判別することができません。
というわけで、前回の変数dを使っていきます。
まず前回のセンサースクリプトはこのようになっていました。
Var evid
SetEventSensor snsev, evid
BeginFunc snsev
VarTrain ressya
GetSenseTrain ressya
ifeq ressya.d 1
call ressya keiteki
DrawMessage 警笛
endif
EndFunc
|
そして踏切(上り線のみVar)の「閉める」センサーはこうなっていました
Var evid
SetEventSensor snsev evid
BeginFunc snsev
call cross1-a close
EndFunc
|
※一部記載を変更しています。
今回は"警笛鳴らせ"の部分が"踏切閉じろ"になるわけです
つまり、"警笛鳴らせ"に"踏切閉じろ"を上書きすればいいのです。
すると下のようなスクリプトになります。
Var evid
SetEventSensor snsev evid
BeginFunc snsev
VarTrain ressya
GetSenseTrain ressya
ifeq ressya.d 1
call cross1-a close
endif
EndFunc
|
なお、今回は単線区間ですので複線区間で示したような「閉める」センサーが2回連続で反応することはないので(反応したら間違いなく正面衝突です。。。)先回やったkazoeru機能は省きます。
ここで踏切のオブジェクト名は以下のように設定します。
オブジェクト名の決め方は先回と同じです
この警報機と遮断機合計4個にまず、以下のスクリプトを書いていきます。
BeginFunc close
SetCrossingStatus 2
EndFunc
BeginFunc open
SetCrossingStatus 1
EndFunc
|
そして、センサーのスクリプトを見てみると
Var evid
SetEventSensor snsev evid
BeginFunc snsev
VarTrain ressya
GetSenseTrain ressya
ifeq ressya.d 1
call cross1-a close
endif
EndFunc
|
というように、cross1-aのcloseを発動せよとありますが、cross1-aのみ閉まるだけではいけないので、cross1-aのcloseに他の遮断機なども反応させます。
Var evid
SetEventSensor snsev evid
BeginFunc snsev
VarTrain ressya
GetSenseTrain ressya
ifeq ressya.d 1
call cross1-a close
call cross1-ak close
call cross1-b close
call cross1-bk close
endif
EndFunc
|
これで上り線「閉める」センサーのスクリプトが完成しました。
次に上り線「開ける」センサーのスクリプトを組みます。
といっても「閉める」センサーのclose部分をopenに変更し、最後尾が通過したら発動するようにします。
|
SetSensorMode 1
Var evid
SetEventSensor snsev evid
BeginFunc snsev
VarTrain ressya
GetSenseTrain ressya
ifeq ressya.d 1
call cross1-a open
call cross1-ak open
call cross1-b open
call cross1-bk open
endif
EndFunc
|
これで上り線の部分は完成しました。
ためしにビュワーを起動してみると
ちゃんと上手く動作してくれました。
もちろんこのC57には前回と同様
と記述してあります。
次に下り線の場合で考えます。
といっても"dが1のときに反応"を"dが-1のときに反応"に変えれば良いだけなのでとても簡単に出来ます。
つまり下り線「閉める」センサーは
Var evid
SetEventSensor snsev evid
BeginFunc snsev
VarTrain ressya
GetSenseTrain ressya
ifeq ressya.d -1
call cross1-a close
call cross1-ak close
call cross1-b close
call cross1-bk close
endif
EndFunc
|
というように1を−1に変更するだけでOKです。
同じく下り線「開ける」センサーも
|
SetSensorMode 1
Var evid
SetEventSensor snsev evid
BeginFunc snsev
VarTrain ressya
GetSenseTrain ressya
ifeq ressya.d -1
call cross1-a open
call cross1-ak open
call cross1-b open
call cross1-bk open
endif
EndFunc
|
とすればOK。
これでビュワーを起動すれば
下り列車も上手く反応しました
もちろんこのC57には下り列車なので
と記述してあります。
これで踏切(単線Var)のスクリプトがが完成です。お疲れ様でした。
今回のスクリプトの注意点は編成に必ず
もしくは
という構文を忘れないで下さい。
もしこの構文がないとセンサーが上り列車なのか下り列車かを判断することができず、スクリプトの挙動がおかしくなってしまいます。
また、上り列車/下り列車を取り違えて変数dの値が違ってしまうと同じくちゃんと動いてくれないので注意して下さい。
次回は自動運転の第一歩として、センサーを踏んだら列車を停止→発車させるスクリプトを組んでいきます。
次回へ>>>>>>
|