センサー通過で赤信号にする


前回と同様のレイアウトにセンサーを2つ加えたものを用意して下さい。

また、後々煩わしくなるので前回信号機に書いたスクリプトはすべて削除して下さい。

今回は、スクリプトの文字の意味、マニュアルに出てくるよくワカラン単語の意味を中心に扱っていきます。
スクリプトの構造やゼロからの書き方などは次回に詳しく解説します。今回は単語の"意味"さえ解っていただければ幸いです。

んで、さっそく・・・・

このスクリプトウィザード使います。

 

 

 

・・・・"ウィザード使って終わり"なんてことないのでご安心を(^^;


今回は説明を簡単にするため2灯式信号機の場合で進めていきます。(ちなみにレイアウター上にある信号機は何灯式でも良いです)

簡易wizadで進めていきます。


信号機は一つだけなのでそのまま選びます

 


最初のセンサー選択はとりあえず上のヤツを選んで下さい。

 


2つ目のセンサー選択は最初のとは別のものを選んで下さい。

 


これで完了です。OKボタンをクリックして下さい。

 

すると以下のようなスクリプトが生成されているはずなので確認して下さい。

 

 

 

[信号機のスクリプト]
//SCRWIZ-GLB[vrm4_signal_block2]-IN
SetSignal 6
//SCRWIZ-GLB[vrm4_signal_block2]OUT
//SCRWIZ-FNC[vrm4_signal_block2]-IN
BeginFunc color_red
SetSignal 1
EndFunc
BeginFunc color_blue
SetSignal 6
EndFunc
//SCRWIZ-FNC[vrm4_signal_block2]OUT
 

 

 

[最初に選んだセンサーのスクリプト]
//SCRWIZ-GLB[vrm4_signal_block2]-IN
Var evid
SetEventSensor snsev, evid

//SCRWIZ-GLB[vrm4_signal_block2]OUT
//SCRWIZ-FNC[vrm4_signal_block2]-IN
BeginFunc snsev
call "SIGNAL7", color_red
EndFunc
//SCRWIZ-FNC[vrm4_signal_block2]OUT

 

 

 

[2つめに選んだセンサーのスクリプト]
//SCRWIZ-GLB[vrm4_signal_block2]-IN
Var evid
SetEventSensor snsev, evid

//SCRWIZ-GLB[vrm4_signal_block2]OUT
//SCRWIZ-FNC[vrm4_signal_block2]-IN
BeginFunc snsev
call "SIGNAL7", color_blue
EndFunc

//SCRWIZ-FNC[vrm4_signal_block2]OUT

 

 

 

さて、このスクリプトを見た時点では何が何だか解りません。
今回はこれを紐解いていきます。

 

 

 

まず、[最初に選んだセンサー]のスクリプトを見てみます。
//SCRWIZ-GLB[vrm4_signal_block2]-IN
Var evid
SetEventSensor snsev, evid

//SCRWIZ-GLB[vrm4_signal_block2]OUT
//SCRWIZ-FNC[vrm4_signal_block2]-IN
BeginFunc snsev
call "SIGNAL7", color_red
EndFunc
//SCRWIZ-FNC[vrm4_signal_block2]OUT

まず1行目から難しそうですが、実はこれはスクリプトに関与しておりません。
スクリプトマニュアルの左側のメニューにある"言語仕様"の欄にある"構文"というページを開いて下さい。
そのページの5,6行目に

"//"で開始される行は、リマーク(注釈)としてコンパイルの対象外になります。

と書かれています。

つまり、行の頭に"//"があれば何が書いてあってもスクリプトの対象外、すなわちその行は完全に無視されます。
また、裏を返せばどの行に書いても良いし別に書く必要もありません。

"//"は何のためにあるかというと長いスクリプを書く際、ごっちゃにならないよう見出しを付けるために使用します。
なお、「"」や「,」も便宜上付けるもので同様に無視されます
ただしこれは行全体ではなく「"」「,」そのものだけが無視されます、つまり「call "SIGNAL7", color_red」と「call SIGNAL7 color_red」は全く一緒の意味になります

今回は長いスクリプトは書かないので"//"部分は正直必要ありません。
ですので"//"の行は全部消しちゃいます。
すると以下のようにすっきりしました。

[最初に選んだセンサー・改]
Var evid
SetEventSensor snsev, evid

BeginFunc snsev
call "SIGNAL7", color_red
EndFunc

なんとなく簡単に見えてきました。
もちろん、この状態でもビュワーは起動できます。


息抜きにEF66でもどぉぞ

では、まず1行目から見てみましょう。
最初は"Var evid"と書かれています。
Varは前回でてきた変数宣言です。
これは"evid"(多分event id:[イベントID]の略記)は変数であると宣言しています。

ここはこれ以上掘り下げられないのでサクサクすすんでいきます。

−2行目−
SetEventSensor snsev, evid

2行目はなんだか中身がありそうです。
早速スクリプトマニュアルのセンサーの欄にあるSetEventSensorをクリックします。

するとこんなことが書かれています。

SetEventSensor メソッド名 イベントIDを受け取るグローバル変数
version 4.0.0.0

センサーイベントのコールバックを登録します。センサーは列車が通過するときにイベントを発生し、登録されたコールバックを呼び出します。
イベントを登録すると、イベントハンドラーを識別するためのイベントIDが変数に設定されます。

センサーは列車が通過するときにイベントを発生し・・・と書かれているので恐らく列車がセンサーを踏んだ瞬間に何かを起こす命令文みたいですね。
早速マニュアルとスクリプトの2行目を照らし合わせると・・・

SetEventSensor snsev, evid
コレと

SetEventSensor メソッド名 イベントIDを受け取るグローバル変数
コレから・・・

メゾット名:snsev
変数:evid

ということみたいです。
変数の"evid"は前の行でVarの変数宣言してますので問題ないですね。(グローバル変数のグローバルの部分の説明は後述)

さて、メゾット名とはなんぞや?

スクリプトマニュアルのOverview(左のメニューの一番上)のページを開いて、区切り線から7段落目の頭に

BeginFuncで始まるひとくくりが、1つのメソッドとして外部に公開され、・・・(以下略)

と書かれています。
「BeginFuncで始まるひとくくり」というのは

BeginFunc

//この間が「BeginFuncで始まるひとくくり」

EndFunc

とあるようにメゾットはBeginFuncからEndFuncまでの部分を指します。
ちなみにBeginFuncは恐らくBeginFunctionの略記で、直訳すると"はじまる、機能"という意味になります。
同じくEndFuncは"終わり、機能"という意味になります。

これが「1つのメソッド・・・」なので、「BeginFuncで始まるひとくくり」の名前が"メゾット名"になるのです。
となると「snsev」という名前の「BeginFuncで始まるひとくくり」がどこかにあるはずです。

ということでセンサーのスクリプトスクリプトに戻って探してみます
ちょっと下の三行を見てみると・・・

Var evid
SetEventSensor snsev, evid

BeginFunc snsev
call "SIGNAL7", color_red
EndFunc

さっそく「snsev」という名前の「BeginFuncで始まるひとくくり」がみつかりました!

ここで一度まとめると「SetEventSensor snsev, evid 」というのは

列車がセンサーを通過したときにsnsevという名前の機能を発動させる

ということです。

evidの部分に関してですが、これは主にKillEvent系列で使用するもので、今回は特に重要ではありません。
当面はとりあえず要る物と考えておいて下さい。


字ばっかりだとつまらないので大阪環状線の201系の写真でも・・・

では、「snsevという名前の機能」の中身を見ていきましょう。

call "SIGNAL7", color_red

中身といってもこれだけです。

まずスクリプトマニュアルの分岐、コール欄にある"call"をクリックして下さい。
以下のようなことが書かれています。

call オブジェクト名またはオブジェクト変数 メソッド名
version 4.0.0.0

オブジェクトのメソッドを呼び出します。メソッドが終了すると、次の命令に移行します。

マニュアルとスクリプトを照らし合わせると

オブジェクト名:SIGNAL7
メゾット名:color_red

ということみたいです。
オブジェクト変数は他の頁で解説します。今回はオブジェクト名のみで考えていきます。

あと単刀直入に言いますと、オブジェクト名というのはこれです。

上は信号機を右クリックして信号機設定を選んだときに出てくるメニューです。

メゾット、直訳すると「物事の筋道」であるので、意訳すると"スクリプトの筋道"もしくは"スクリプトの機能"となりメゾット名は"スクリプトの機能の名前"となります
これだと、メゾットとFunctionの意味が同じ"機能"となってしまいますが、BeginFunction〜EndFunction=メゾットなので殆ど同じ意味だと思って下さい。
つまり「snsevという名前の機能」の中身「call "SIGNAL7", color_red」の意味は

SIGNAL7という名前の部品の中のスクリプトにあるcolor_redという機能を発動しなさい

と命令しているわけです。

よって、このセンサーのスクリプト
Var evid
SetEventSensor snsev, evid

BeginFunc snsev
call "SIGNAL7", color_red
EndFunc

を一行ごとに解説すると
evidは変数であると宣言(ここはとりあえずしておいて下さい)
列車が通過したらsnsevを発動しなさい

snsevの中身はここから
"SIGNAL7"という名前の部品のスクリプトの中にあるcolor_redという機能を発動しなさい
snsevの中身はここまで

大まかに言うとこんな感じです。

それではこの"color_red"とはどういう機能なのか?
今度は部品名"SIGNAL7"の部品(信号機の名前がデフォルトでこれに設定されています。ただしコピぺ時を除き数字部分は部品番号に依存します)のスクリプトを見てみましょう。
例によって"//"の行はすべて消します。

[信号機のスクリプト・改]
SetSignal 6

BeginFunc color_red
SetSignal 1
EndFunc

BeginFunc color_blue
SetSignal 6
EndFunc

これのcolor_redだけを見てみると

BeginFunc color_red
SetSignal 1
EndFunc
「SetSignal 1」の命令文しか書かれておりません。
つまりcolor_redという機能は"信号を赤にする"という機能なのです。

これらスクリプトの流れを一つにまとめると。

[信号機のスクリプト・改]より
センサーの中
列車がセンサーを踏む

SetEventSensorでsnsevを発動

----snsev開始----
[SIGNAL7のcolor_redを発動させる]
----snsev終了----

信号機の中
センサーからcolor_redの発動命令が来る

color_red発動

信号機を赤信号に。

これでスクリプトの目標であった「列車がセンサーを踏む→信号機を赤信号に。」というプロセスを構成しています。
この流れさえ掴めればセンサーで大抵のものが制御出来るようになります。
残った[2つめに選んだセンサーのスクリプト]ですが、これは[最初に選んだセンサー]の「信号機を赤信号に」という部分を「信号機を青信号に」すげ替えただけなので、改めては解説いたしません。

次回は今回の復習も含めて「踏切」のスクリプトの解説を進めていきます。

次回へ>>>>


前へ戻る

inserted by FC2 system