最終日の今日は、簡単な自動運転スクリプトを書いてみましょう。
どういうものかというと、待避線のある駅が1つの単線小判型ループに、2本のお互いに逆方向に走る列車を配置します。まずキーを押すと、信号が青になって1本が発車し、一周して戻ってきて停車します。すると今度は対向列車の信号が青になって自動で発車し、一周して戻ってきて停車。あとはこの繰り返しで、駅で2つの列車が交換を繰り返すというモノです。
第2号をお持ちの方は
こちらをダウンロードして実際に書いてみてください。このサンプルレイアウトでは、編成・信号・ポイント・センサーの名前は既に書き直してありますが、スクリプトは白紙状態です。
さて、この「単線自動交換」を実現するにはどうすればよいでしょうか。まず使う部品を整理しましょう。
(1)編成
なくてはならない、編成です。
ここでは発車や減速〜停車をSetTimerVoltageを使って命令します。
(2)ポイント
最初にデフォルトの編成が一周して駅についた後、自動でもう1本の編成が発車します。でもVRM4では間違った方向からポイントに進入すると編成が強制停止してしまうので、発車する前に駅のポイントを切り替えておかないと発車できませんね。ですからポイントにはポイントの向きを切り替えるメソッドを書いておくことが必要になります。
(3)信号
おまけみたいなもので編成の制御には影響を及ぼしませんが、はじめは赤が点灯していて発車する直前に青になるようにすると面白いですよ。
(4)センサー
編成の停車位置にセンサーを置き、それを一周して戻ってきた編成が踏んだときにもう一方の編成の発車メソッドをcallすれば「一方の編成が進入して停車するともう一方の編成が発車する」という挙動を再現できます。
また、停車位置の手前にも踏んだ編成の減速メソッドをcallするセンサーを置きます。
これら4種類の部品を以下のように配置します。直近の単語は部品につけた名前です。センサーの名前は込み入るので、離して記してあります。

<動作の流れ>
デフォルトの編成は「ED75」です。最初にAキーを押すと信号「WestSignal」が青になり、「ED75」は自動で加速します。一周して駅に戻るとセンサー「SlowdownED75」を踏んで減速し、このとき同時に信号「WestSignal」を赤に戻します。停車位置には「StartED75jr」が置かれていて「ED75」は停車直前にそれを踏みます。
すると今度は信号「EastSignal」が青になった後「ED75jr」が加速を始めます。一周して駅に戻るとセンサー「SlowdownED75jr」を踏んで減速し、このとき同時に信号「EastSignal」を赤に戻します。そして停車位置には「StartED75」が置かれていて「ED75jr」が踏めば再び「WestSignal」が青になり「ED75」が発車します。
これの繰り返しです。フライスルーカメラにして駅周辺で待っていれば、貨物列車が交換を繰り返す様を眺めることができます。
<使用する命令>
今回、前述の4種類の部品で使う命令は以下のようになります。
(1)編成(と車両)
・
SetTimerVoltage 0.0〜1.0 待ち時間 駅発車と停車の両方に使えますね。編成の速度制御は今回この命令に全て任せます。
・
SetHeadlight/SetTaillight 0又は1 ライトが点いているとそれだけでもかっこいい!
(2)ポイント
・
SetPointBranch 0又は1 branchは「分岐」の意味ですね。0は直進側、1は分岐側に設定します。
(3)信号
・
SetSignal 1〜6 今回は2灯式信号を使用するので、現示は「停止」「進行」の2種類だけです。停止のときは変数を1、進行のときは6にします。2〜5は「警戒」や「注意」などがある信号で使います。詳しくはリファレンスを参照してください。
イベント系統の命令
・
SetEventSensor 呼ぶメソッドの名前 グローバル変数・
SetEventKey 呼ぶメソッドの場所 呼ぶメソッドの名前 グローバル変数 キー・
call 呼ぶメソッドの場所 呼ぶメソッドの名前 この3つは紹介済みですし説明はいりませんね。もう1つ、callに似ているけれどちょっと違うこの命令を使います。
・
SetEventAfter 呼ぶメソッドの場所 呼ぶメソッドの名前 グローバル変数 時間 callは即座にメソッドを呼びますが、この命令は任意の時間後に呼ぶことができます。よく見てください、右側に書き入れる変数はcallにグローバル変数と待ち時間が加わっただけですね(そういう意味ではSetEventKeyもcallにグローバル変数とキーが加わっただけです)。
なお、時間はSetTimerVoltageと同じく1000分の1秒で書き入れます。
____________________
まず初期設定を書いてしまいましょう。BeginFuncとEndFuncで挟まない命令は最初に実行されるのでしたね。最初から実行されていてほしい命令と言えば…
まず車両のスクリプトエディター(編成のではありません!)にライト類を点灯させろ!と書いてしまいましょう。
<車両のスクリプトエディター>
SetHeadlight 1
SetTaillight 1
2両のED75に書いてください。これでビュアーを起動したときからライトが光り続けます。
信号機も消えていてはおかしいですね。とりあえずはじめは全部赤現示で。
<2灯式信号のスクリプトエディター>
SetSignal 1
東西2基の信号に書けましたね。これで初期設定はOKです。つぎに速度制御のメソッドを書きますが、速度ですから編成のスクリプトエディターに書きます。
<編成のスクリプトエディター>
BeginFunc LetsGo
SetTimerVoltage 0.7 3000
EndFunc
BeginFunc StopTrain
SetTimerVoltage 0.0 5000
EndFunc
これは2つの編成共通ですから、両方に書いてください。
発車用メソッドLetsGoの加速に要する時間はあなたの自由にしてかまいませんが、他の値は変えないでください。変えると、一周して駅に戻ったときに正しい位置に停車できません。
内容は見ればわかる通り、加速用メソッドと停車用メソッドです。
さて、編成の速度制御に連動して動作させたい動きがまだ2つありましたね。信号の現示とポイントの向きです。これらもメソッドだけ部品に書いておきましょう。
<2灯式信号のスクリプトエディター>
BeginFunc Green
SetSignal 6
EndFunc
BeginFunc Red
SetSignal 1
EndFunc
<ポイントのスクリプトエディター>
BeginFunc Straight
SetPointBranch 0
EndFunc
BeginFunc Curve
SetPointBranch 1
EndFunc
これらもそれぞれ2つの信号、ポイントの両方に書いてください。信号に書くときは、さっき書いた初期設定用の
SetSignal 1を消しちゃわないように注意。
これで「何を」やるかは一通り書けました。あとは的確なタイミングでメソッドを呼んでやるだけです。
順番に、まずはAキーを押すと信号「WestSignal」が青になり編成「ED75」が加速するというのを書きましょう。
<レイアウトのスクリプトエディター>
Var AHO
Var MANUKE
SetEventKey this CallLetsGo AHO a
BeginFunc CallLetsGo
call WestSIGNAL Green
SetEventAfter ED75 LetsGo MANUKE 1000
EndFunc
冒頭で宣言した2つの変数のうちAHOはSetEventKey、MANUKEはSetEventAfterで使うためのものです。下半分のメソッド「CallLetsGo」は中継用メソッドですね。Aキーを押すとCallLetsGoが呼ばれ、そのCallLetsGoがWestSIGNALのGreenとED75のLetsGoを呼びます。
日本語で書くと、WestSignalを青にして1秒後にED75を加速するということですね。
次に、ED75が一周して戻ってきてはじめて踏むセンサー「SlowdownED75」です。
<センサー「SlowdownED75」のスクリプトエディター>
Var AHO
SetEventSensor CallStopTrain AHO
BeginFunc CallStopTrain
call WestSIGNAL Red
call ED75 StopTrain
EndFunc
これも構造的にはSetEventKeyのものと変わらないですね。SetEventSensorに呼ばれた中継用メソッド「CallStopTrain」がWestSIGNALのRedとED75のStopTrainを呼ぶ。すなわち「センサーを踏んだら信号が赤になって列車が減速〜停車する」という内容です。
さて、減速し停車するED75が踏むのが次のセンサー「StartED75jr」です。このタイミングで信号「EastSIGNAL」を青にして対向の編成「ED75jr」を発車すればまさに列車交換ですね。ただ、ED75が駅に滑り込んだ瞬間ED75jrが発車するのは少し焦りすぎというか不自然ですから、SetEventAfterで時間差を作ってやるわけです。
<センサー「StartED75jr」のスクリプトエディター>
Var AHO
Var MANUKE
SetEventSensor CalljrLetsGo AHO
BeginFunc CalljrLetsGo
call EastSIGNAL Green
call WestPOINT Curve
call EastPOINT Curve
SetEventAfter ED75jr LetsGo MANUKE 3000
EndFunc
今度の中継用メソッドが担う役割は「対向の信号を青にして、しばらく経ったらED75jrを発車する」ですね。ただし忘れてならないのはポイントの切替えです。2つのポイントを切り替えないと、発車するときか一周して戻ってくるときに強制停止の憂き目にあいます。
ついでに、3つ以上のポイントがあってcall命令がずらっと並んでヤダなぁというときは
こんな方法もあります。
さあED75jrが発車していきました。あとは同じです。戻ってきたED75jrが最初に踏むセンサー「SlowdownED75jr」で、今度はEastSIGNALを赤にしたうえでED75jrを減速します。そして次に踏むセンサーでWestSIGNALを青にしてポイントの向きを直進に戻し、時間差でED75を発車させれば、無限ループの完成です。
具体的には以下のようになりますが、解説はしませんよ。
<センサー「SlowdownED75jr」のスクリプトエディター>
Var AHO
SetEventSensor CallStopTrain AHO
BeginFunc CallStopTrain
call EastSIGNAL Red
call ED75jr StopTrain
EndFunc
<センサー「StartED75」のスクリプトエディター>
Var AHO
Var MANUKE
SetEventSensor CallLetsGo AHO
BeginFunc CallLetsGo
call WestSIGNAL Green
call WestPOINT Straight
call EastPOINT Straight
SetEventAfter ED75 LetsGo MANUKE 3000
EndFunc
あー、1つだけ。このスクリプトは簡単のため、ここに書いたとおりに書けばうまいこと停車位置とセンサーが重なるようにしてあります。さっき速度制御用メソッドはいじらないで、と書いたのはそのためです。もちろん手動の速度操作を封じたり、色々な速度からでも一定の位置に停車する方法はありますが、今回はあくまでサンプルと言うことでやってません。
ですからこのレイアウトで遊ぶときは眺めるだけにして、手動の速度操作は一切しないでください。
____________________
はい、終わりです。どうでしたか?何となくでもわかった気がしてきませんか?
本当はif命令やSetEventTimer、KillEventなんかもやりたかったんですが…。まあ今のあなたなら自力で答えにたどり着けるか。
もしわからないところがあったら遠慮なくコメント欄に質問ください。自分にわかる範囲ならお答えしますし、わからないところでもたぶん暇な人が見つけてフォローしてくれるでしょう(ぉぃ
よっしゃ!スクリプト楽勝!
他の日へはこちら