センサー通過で型式番号をログウィンドウに表示させる

今回は"編成のグローバル変数をセンサーに読ませる"ということ行います。
予定では踏切(単線Var)の中での解説を考えていましたが、かなりややこしくなってしまうため解説のワンクッションとして今回の話を進めていきます。


センサーと適当な編成を用意して下さい(コンテナは目印としておいてあるだけなので無くても構いません)

まず、編成に以下のスクリプトを書きます。(車両を右クリックして・・・・ではなく、編成エディター右下のスクリプトエディターと書いてあるボタンを押して下さい)

変数名は適当にdとしておきます。(なぜdにしたのかは後述します、とりあえずこのとおりに書いていって下さい)

Var d
set d 65


今回はEF65を使用しているのでset d 65とします。

さらに、今書いたスクリプトに以下の命令文を加えて、以下のようにします。

Var d
set d 65

DrawVar d

このDrawVarという命令文はスクリプトマニュアルの"メッセージ表示"という欄の一番下にあり、命令の内容は「変数の内容」つまり今回の場合で言うと変数dの値はいったい何なのかをログウィンドウに表示させる命令文なのです。

この状態でビュワーを起動すると、ログウィンドウに

このように"[int] : 65"、すなわち変数dの値が表示されます
この命令文はスクリプトマニュアルにもあるとおりデバック(バグを直すこと)するときに使用します。

さて、今回はこの"[int] : 65"という文を、列車がセンサーを通過したときに出してやろうというのが目標です。

まず、ビュワー起動時に"[int] : 65"がでてしまってはマズイのでさっき書いた"DrawVar d"の文を消して以下の状態に戻します。

Var d
set d 65

次に、センサーのスクリプトをいじっていきます。

前回のスクリプトを改造していきます

前回のスクリプト
Var evid
SetEventSensor snsev, evid

BeginFunc snsev

VarTrain ressya
GetSenseTrain ressya

call "ressya", keiteki

EndFunc

今回は警笛を鳴らすわけではないので「call "ressya", keiteki」の部分を消去します。

そしてその場所にさっき書いた"DrawVar d"を持ってくると以下のようになります。
(赤文字が変更点)
Var evid
SetEventSensor snsev evid

BeginFunc snsev

VarTrain ressya
GetSenseTrain ressya

DrawVar d

EndFunc

これで完了!と言いたいところですが、この状態でビュワーを起動すると


このようにはじき返されてしまいます。

よく見ると「dは文字ではなく、変数である」という内容のVar dがありません。
しかし、センサーのスクリプトでdは変数であると宣言しても、表示したいEF65の編成スクリプト内に書いた変数dとは全くの別物になってしまいます。

この問題を解決するためには前々回にやった

つまり早い話が部品名と変数名の間にドットを挟む形、すなわち「部品名.変数名」で「部品の変数」にアクセスできるのです。
具体的に書くと

add cross1-ak.a 1
※ドット部分を見やすくするため文字を大きくしています。

でオブジェクトcross1-akで変数であると宣言されたaに1を足すという意味になります。

これを応用します。

この方法は「部品名.変数名」だけでなく「オブジェクト変数.変数名」でも使用できるのです。

つまり、オブジェクト変数である"ressya"にも使えるのです。

今回の例で行くと・・・
Var evid
SetEventSensor snsev, evid

BeginFunc snsev

VarTrain ressya
GetSenseTrain ressya

DrawVar ressya.d

EndFunc

と書けば、センサー上を通過した編成名"ressya"の変数dをログウィンドウに表示しなさい。という命令文になるのです。

さて、この状態でビュワーを起動すると・・・


このようにセンサー通過時に"[int] : 65"が表示されました

またDD51を使ってset d 51としても・・・


センサー通過で"[int] : 51"が表示されました


さて、ただ単にログウィンドウに65だの51だの表示するだけでは何の役にも立ちません。
しかし、例えばDD51だけ警笛を鳴らしたいときにこのことが応用できるのです。

まず、編成スクリプトに前回の警笛を鳴らすスクリプトを書き足します。


同じようにEF65にもこれと同じように警笛を鳴らすスクリプトを書き足します

また、センサーのスクリプトにある"ressya.d"は編成スクリプトにおける変数dを読みとっているわけです。
ここでif文を用いて以下のスクリプトを組んでやると・・・

Var evid
SetEventSensor snsev evid

BeginFunc snsev

VarTrain ressya
GetSenseTrain ressya

ifeq ressya.d 51
call ressya keiteki
endif

EndFunc


※ifeq a b : a=bのときのみendifまでを実行、この場合はressya.dが51の時のみcall ressya keitekiが実行されます。

こうすれば編成スクリプトで"set d 51"としたヤツだけ警笛を鳴らすことができ、"set d 65"としたEF65は反応しないのです
もちろんEF65も、編成スクリプトに"set d 65"ではなく"set d 51"としたらDD51になりすまして警笛を鳴らすことが出来るのです。



ちょいと息抜き、敦賀港線。

さて、ここでdを形式名とする以外にもっと有用な使い道があるのです。

 
それは列車の進行方向です。

 
つまり、上り列車の編成スクリプトには"set d 1"、下り列車の編成スクリプトには"set d -1"としてやるのです。

さっきやったressya.dが51の時のみcall ressya keitekiが実行されるというスクリプトを応用して、

ressya.dが1の時のみcall ressya keitekiが実行される

としてやれば、上り列車のみが警笛を鳴らします。
これは駅進入時や短いトンネルの入り口などに使えます。

それではまず、上り列車のみが警笛を鳴らすスクリプトを組んでみます。
なお、警笛が鳴ったかどうかはスクリーンショットでは解らないので警笛が鳴ると同時に"警笛"とログウィンドウに表示させます。
これによりセンサーは以下のスクリプトになります。
Var evid
SetEventSensor snsev, evid

BeginFunc snsev

VarTrain ressya
GetSenseTrain ressya

ifeq ressya.d 1
call ressya keiteki
DrawMessage 警笛
endif

EndFunc


※「DrawMessage ○○」は○○をログウィンドウに表示しなさいという命令文になります。

次に車両のスクリプトを書いていきます。
なお進行方向が分かり易いようにC57を使って解説します。


まず上り列車(画面左から右へ向かう列車とします)を作ります。

上画面のように上り列車は"set d 1"としてやります
ビュワーを起動してみると・・・


トンネル進入時に警笛が鳴りました

次に下り列車の場合で考えてみます。


下り列車なのでset d -1としてやります

これでビュワーを起動してみると・・・


トンネルを抜けたときには警笛が鳴りません

もちろんこの"set d -1"などは1編成だけしか書いてはいけないなんてこと無いので、レイアウト上にあるすべての下り列車にこの構文を書けばトンネルを抜けるときは警笛を鳴らさず、進入する上り列車だけ警笛を鳴らすことが出来ます。

このように単線区間のスクリプト制御においてこの列車の進行方向を見定める変数dの存在はなくてはならないものなのです。

ちなみに何故変数名がdであるのかは、direction(方向)の頭文字をとっているからです。
このようにある程度変数の意味が把握できるような変数名にしておくと、後々書きやすくなります。

−追伸−
スクリプトマニュアルの編成の欄にGetDirection2という命令文がありますが、これはドッグホーン型のレイアウトには対応できないためあまりおすすめできません。
なお、ドッグホーン型のレイアウト等は上り列車が下り列車に変化するため、それようの機能(BeginFunc - EndFuncのこと)が必要になります。
このスクリプトに関しては後で解説します。


さて、今回は"編成のグローバル変数をセンサーに読ませる"ということを行いました。
これは方向だけでなく優等列車の設定、例えば
Var rank
set rank 1

というように普通列車はrankを1に、急行列車はrankを2に・・・としていくと、「普通列車のみ停車させる」といった応用も出来ます。

次回はいよいよ踏切(単線Var)の解説を行います。
ここまでお読みいただきありがとうございました

次回へ>>>>>>


前へ戻る

inserted by FC2 system