今回はセンサー通過で警笛を鳴らす方法を解説します。
まずはセンサーと列車を用意して下さい。

まず"警笛を鳴らせ"という命令文をスクリプトマニュアルから探し出します。
すると"編成"の欄にPlayHornというのがあります。
というわけでこれを書き込みます。
ちなみに、"編成"ではなく"車両"の欄に書かれている命令文はここに書いた時しか機能しないので今回はこちらに書き込まないように注意して下さい。

今回はこっちに書いていきます。

"編成"の欄にあった命令文なのでここをクリックして出てきたウィンドウに書き込みます。
それでは書いていきます。
PlayHornだけ書いてもビュワー起動時に1回発動するだけですのでBeginFuncで固めます。
メゾット名は適当にkeitekiとでもしておきます。
BeginFunc keiteki
PlayHorn
EndFunc
|
んで、callでこれを発動させるスクリプトをセンサーに組み込めばいいわけです。
例によってメチャクチャ便利なスクリプト
Var evid
SetEventSensor snsev, evid
BeginFunc snsev
call "オブジェクト名", メゾット名
EndFunc
|
を使って書くと・・・
Var evid
SetEventSensor snsev, evid
BeginFunc snsev
call "DD51", keiteki
EndFunc
|
これで完成!メチャクチャ便利です。
ちなみに車両のオブジェクト名は

ここで決めます。
さてさて、以上のスクリプトを書き込んで運転してみます。

無事にセンサー通過で警笛が鳴りました。
・・・・・しかし、このスクリプトには重大な欠陥があるのです。
編成が1つだけしかないレイアウトならばこれでも良いのですが、他の編成が入ってくると不具合が出てしまうのです。
試しに今度はDD51の他にEF65も加えてみます。

なお、コンテナはセンサーの位置を示しています。
今回センサーに書いたスクリプトは"列車が通過したらDD51の警笛を鳴らせ"ということでした。
もしこのセンサーにDD51ではなくEF65が通過した場合も"列車が通過したらDD51の警笛を鳴らせ"というスクリプトが発動されてしまいます。
つまり、このセンサーの上を列車が通過するたびにDD51の警笛が鳴ってしまうわけです。
今回はこの問題を解決していきます。
今回紹介するのはメチャクチャ便利なスクリプトでも対応しきれない部分を埋める万能スクリプトです
まずスクリプトマニュアルのセンサーの欄にある"GetSenseTrain"という命令文をクリックして下さい。
すると以下のことが書かれています。
GetSenseTrain 編成オブジェクト変数
version 4.0.0.0
センサーが検出した編成を取得します。イベントコールバック内部に記述します。
編成オブジェクト変数に取得した編成オブジェクトのメソッドをコールすることで「編成に反応」>>「編成に所定の動作をさせる」という一連の流れを実現できます。
(以下略)
|
この命令文が今回の問題を解決するカギになります。
これによるとGetSenseTrainの後に編成オブジェクト変数を持ってこなくてはいけません。
編成オブジェクト変数というのはスクリプトマニュアルの変数宣言の欄にあるVarTrainという所をクリックして下さい。
VarTrain オブジェクト変数名
version 4.0.0.0
編成オブジェクトを保持する変数を宣言します。
BeginFunc - EndFuncの内側で宣言した変数は、ローカル変数になります。外側で宣言した変数は、グローバル変数になります。変数名は、32バイト(16文字)以内で設定してください。
コーディングサンプル
//編成オブジェクト変数trainの宣言
VarTrain train
|
・・・・・なんかよくワカランことが書いてありますが、要は変数を宣言しているだけなんです。
というわけで編成オブジェクト変数を宣言して、GetSenseTrainを使ってみます
変数名は適当にressyaとでもしておきます
VarTrain ressya
GetSenseTrain ressya
|
ここで一度初回の変数の話を思い出して下さい。
|
「set 変数 整数」すなわち「set a 6」といったようにsetのあとに文字と数字を並べます。
これは"文字a"を無理矢理6とおくということです。
|
詰まるところGetSenseTrainはこれと似たような働きをするのです。
上記の"文字a"の部分を編成オブジェクト変数、"6"の部分をセンサーの上を通過した列車とすり替えたのがGetSenseTrainなのです。
つまり
|
これは"編成オブジェクト変数"を無理矢理"センサーの上を通過した列車"とおくということです。
|
この場合
VarTrain ressya
GetSenseTrain ressya
|
に当てはめて考えてみると
|
これは"ressya"を無理矢理"センサーの上を通過した列車"とおくということです。
|
もっと意訳すると
|
"センサーの上を通過した列車"を無理矢理"ressya"ということにする。
|
となります。
つまり、センサーの上を通過した列車がDD51であろうとEF65であろうと矢橋ホキであろうと、 とにかく通過した列車はすべて"ressya"という名前に決めつける命令文なのです
一見意味なさげな命令文なのですが、これが非常に役立ちます。
つまり、
1.通過した列車はすべて"ressya"という名前に決めつける
2.ressyaのメゾットkeitekiを発動する
|
というスクリプトを組めば、今回の問題を解決できます。
では、さっそく書き込んでいきます
さっき書いたセンサーのスクリプトは以下のようになっていました。
Var evid
SetEventSensor snsev, evid
BeginFunc snsev
call "DD51", keiteki
EndFunc
|
この中にコレを組み込みます。
VarTrain ressya
GetSenseTrain ressya
|
GetSenseTrain ressyaという命令文の意味はとにかく通過した列車はすべて"ressya"という名前に決めつける命令文なのでセンサーが反応する度に発動させなければなりません。
というわけでBeginFunc−EndFuncの中に書き込みます。すると・・・
Var evid
SetEventSensor snsev, evid
BeginFunc snsev
VarTrain ressya
GetSenseTrain ressya
call "DD51", keiteki
EndFunc
|
さらに、今回警笛を鳴らせるのはDD51ではなくセンサーの上を通過した列車なので・・・
Var evid
SetEventSensor snsev, evid
BeginFunc snsev
VarTrain ressya
GetSenseTrain ressya
call "ressya", keiteki
EndFunc
|
これでセンサーを通過したら"ressya"のメゾット"keiteki"を発動させよという命令文になります。
この"ressya"というのはGetSenseTrainを用いて"センサーの上を通過した列車"を意味しているのでもっと言い換えると、
センサーを通過したら"センサーの上を通過した列車"のメゾット"keiteki"を発動させよという命令文になります。
一つ注意しなければならないのは、このセンサーの上を通過する列車にすべて"keiteki"のメゾットを組み込まなければなりません。
もし"keiteki"のメゾットが無い場合callしても相手がkeitekiというメゾットを持っていないため完全に機能しません。
それではセンサーのスクリプトとEF65にも"keiteki"のメゾットを書き込んでビュワーを起動します。

無事にDD51ではなくEF65の汽笛が鳴りました。
今回の解説はここまでです。お疲れ様でした。
次回は踏切(単線var)を作るワンクッションとしてセンサー通過で型式番号を表示させるスクリプトを作っていきます。
次回へ>>>>>
|