|
今回は"編成のグローバル変数をセンサーに読ませる"ということ行います。 予定では踏切(単線Var)の中での解説を考えていましたが、かなりややこしくなってしまうため解説のワンクッションとして今回の話を進めていきます。
![]() センサーと適当な編成を用意して下さい(コンテナは目印としておいてあるだけなので無くても構いません) まず、編成に以下のスクリプトを書きます。(車両を右クリックして・・・・ではなく、編成エディター右下のスクリプトエディターと書いてあるボタンを押して下さい) 変数名は適当にdとしておきます。(なぜdにしたのかは後述します、とりあえずこのとおりに書いていって下さい)
![]() 今回はEF65を使用しているのでset d 65とします。 さらに、今書いたスクリプトに以下の命令文を加えて、以下のようにします。
このDrawVarという命令文はスクリプトマニュアルの"メッセージ表示"という欄の一番下にあり、命令の内容は「変数の内容」つまり今回の場合で言うと変数dの値はいったい何なのかをログウィンドウに表示させる命令文なのです。 この状態でビュワーを起動すると、ログウィンドウに
![]() この命令文はスクリプトマニュアルにもあるとおりデバック(バグを直すこと)するときに使用します。 さて、今回はこの"[int] : 65"という文を、列車がセンサーを通過したときに出してやろうというのが目標です。 まず、ビュワー起動時に"[int] : 65"がでてしまってはマズイのでさっき書いた"DrawVar d"の文を消して以下の状態に戻します。
次に、センサーのスクリプトをいじっていきます。 前回のスクリプトを改造していきます
前回のスクリプト
今回は警笛を鳴らすわけではないので「call "ressya", keiteki」の部分を消去します。
そしてその場所にさっき書いた"DrawVar d"を持ってくると以下のようになります。
これで完了!と言いたいところですが、この状態でビュワーを起動すると
![]() このようにはじき返されてしまいます。
よく見ると「dは文字ではなく、変数である」という内容のVar dがありません。 この問題を解決するためには前々回にやった
つまり早い話が部品名と変数名の間にドットを挟む形、すなわち「部品名.変数名」で「部品の変数」にアクセスできるのです。
でオブジェクトcross1-akで変数であると宣言されたaに1を足すという意味になります。
この方法は「部品名.変数名」だけでなく「オブジェクト変数.変数名」でも使用できるのです。 つまり、オブジェクト変数である"ressya"にも使えるのです。
今回の例で行くと・・・
と書けば、センサー上を通過した編成名"ressya"の変数dをログウィンドウに表示しなさい。という命令文になるのです。 さて、この状態でビュワーを起動すると・・・
![]() このようにセンサー通過時に"[int] : 65"が表示されました またDD51を使ってset d 51としても・・・ ![]()
![]() センサー通過で"[int] : 51"が表示されました
さて、ただ単にログウィンドウに65だの51だの表示するだけでは何の役にも立ちません。 しかし、例えばDD51だけ警笛を鳴らしたいときにこのことが応用できるのです。
まず、編成スクリプトに前回の警笛を鳴らすスクリプトを書き足します。 ![]() 同じようにEF65にもこれと同じように警笛を鳴らすスクリプトを書き足します
また、センサーのスクリプトにある"ressya.d"は編成スクリプトにおける変数dを読みとっているわけです。
※ifeq a b : a=bのときのみendifまでを実行、この場合はressya.dが51の時のみcall ressya keitekiが実行されます。
こうすれば編成スクリプトで"set d 51"としたヤツだけ警笛を鳴らすことができ、"set d 65"としたEF65は反応しないのです
![]() ちょいと息抜き、敦賀港線。 さて、ここでdを形式名とする以外にもっと有用な使い道があるのです。
さっきやったressya.dが51の時のみcall ressya keitekiが実行されるというスクリプトを応用して、 ressya.dが1の時のみcall ressya keitekiが実行される
としてやれば、上り列車のみが警笛を鳴らします。
それではまず、上り列車のみが警笛を鳴らすスクリプトを組んでみます。
※「DrawMessage ○○」は○○をログウィンドウに表示しなさいという命令文になります。
次に車両のスクリプトを書いていきます。
![]() まず上り列車(画面左から右へ向かう列車とします)を作ります。
上画面のように上り列車は"set d 1"としてやります
![]() トンネル進入時に警笛が鳴りました 次に下り列車の場合で考えてみます。
![]() 下り列車なのでset d -1としてやります これでビュワーを起動してみると・・・
![]() トンネルを抜けたときには警笛が鳴りません もちろんこの"set d -1"などは1編成だけしか書いてはいけないなんてこと無いので、レイアウト上にあるすべての下り列車にこの構文を書けばトンネルを抜けるときは警笛を鳴らさず、進入する上り列車だけ警笛を鳴らすことが出来ます。 このように単線区間のスクリプト制御においてこの列車の進行方向を見定める変数dの存在はなくてはならないものなのです。
ちなみに何故変数名がdであるのかは、direction(方向)の頭文字をとっているからです。
−追伸−
さて、今回は"編成のグローバル変数をセンサーに読ませる"ということを行いました。 これは方向だけでなく優等列車の設定、例えば
というように普通列車はrankを1に、急行列車はrankを2に・・・としていくと、「普通列車のみ停車させる」といった応用も出来ます。
次回はいよいよ踏切(単線Var)の解説を行います。
|