「ゆゆぽん☆退避/追越列車とか作っちゃうかMona-(5)−信号をどの色にすべきか判別する」
VRMスクリプト禅問答
<<前回へ
今回は課題(2)-1“信号をどの色にすべきか判別する”を取り上げます。判別する、というと難しそうに見えますが、今回はその基本中の基本に絞ります。いわゆる“区間閉塞”は、今回と次回の内容を押さえた上で、それを土台にして解決していく課題となります。
ここでいう基本中の基本とは何かと言いますと、出発信号にせよ閉塞信号にせよ、つまり信号の種類を問わず、すべてに共通する信号動作です。それは“
(イ)信号の配置された場所を
(ロ)信号に向かって(ハ)編成が通過すると、その
(ニ)信号は赤(R現示)になる”です。現実の鉄道では、この仕組みが単純な追突を防止するもっとも基本的な保安機構になっています。
この(イ)〜(ニ)をVRMの世界に翻訳すると以下のようになります。
[h] (イ)はレイアウター上での信号配置がこれにあたる。
[i] (ロ)は編成の進行方向をGetDirection命令で得ることがこれにあたる。本連載では話を単純化するためにすべての編成が上下線分離の一方通行である前提で考えるので、これは無視して良い。
[j] (ハ)はセンサーイベントがこれにあたる。信号部品自体にはセンサー機能がないので、センサーは信号を配置した位置(に隣接するレール上)に配置する必要がある。
[k] (ニ)はSetSignal命令で信号灯火色を設定することがこれにあたる。
以下、これを具体化するために何をしなければならないのか、読み解いていきましょう。
[h]と[j]の後半は、部品の置き方に関する話です。とにかく、レイアウト上のすべての信号に対し、隣接するレール上に正しくセンサーを配置してやれば良い。その際、後々の管理のために名称の付け方に工夫をしておくことをお奨めします。たとえば
・信号部品の名称は SIGNAL{連番} とする。
・センサー部品の名称は SIGSENSOR{連番} とする。
・信号部品と隣接するセンサーの{連番}は同じものにする。
こうしておけば、両者の対応関係、つまり、どのセンサー部品がどの信号部品を制御しているのか、が名称から判断できて便利ですね。
[i]は無視することにしたので、残る[j]前半と[k]がスクリプトで書かなければならない部分です。このうち[k]は全体の課題(2)-2“(2)-1の結果に従って信号灯火を切り換える”のことであり、これは次回解説します。よって、今考えなければならないのは[k]のセンサーイベントだけです。
これは最早サンプルコードを示すまでもないでしょう。強いて言うならば、部品の名称にルールを定めたとは言え、これを正しく管理していくには、センサーイベントから実行されるメソッド内のcall命令、つまり、これが信号部品の“信号を赤に切り替えるメソッド”を実行することになるわけですが、このcall命令の行に信号名称を直接書くのは避けるべきです。
前回、センサーとポイントの関係を例に示したように、センサースクリプトの冒頭でVarSignal命令で信号オブジェクト変数を宣言し、これに対応する信号をgetして、移行はこのオブジェクト変数を使ってcallする、という流儀は遵守することをお奨めします。こうすれば、対応関係の変更に柔軟に対処できますし、何より、レイアウト上の信号を制御するセンサーのスクリプトは、get命令の第二引数(制御される信号の名称)を除いて、全部同じで良いことになります。