|
今回は列車がセンサーを踏んだら停車し、6秒後に発車するスクリプトを作っていきます。
![]() まず「停車しろ」と命令させるセンサーと制御する編成を用意して下さい
列車の速度を制御する(発車、停車、減速・・・etc)命令文は全部で2つしかありません。(細かく言うとまだありますが、今回は実用的でないので省きます) 今回は扱いが簡単な"何秒後に時速○○km/hにしろ"という命令文を使っていきます。
この"何秒後に時速○○km/hにしろ"というのはSetTimerVoltageという命令文です。
スクリプトマニュアルの"編成"の欄にあるこの命令文の内容を見てみると。
とあります。 変数1=電圧 変数2=時間(ミリ秒) とりあえずこのことが言えますね。
時間(ミリ秒)とは?
電圧とは?
VRMではビュワーにあるような○○km/hという速度の表し方の他に、スクリプトなどでよく使う電圧という速度の表し方があります。
第3号収録の103系を例にとって考えてみます。(何色でも可)
このときの電圧と速度の関係は
次に停車しているとき(0km/h)の電圧と速度の関係は
そして中くらいのスピードで走っているとき(50km/h)の電圧と速度の関係は
そして中くらいのスピードより若干遅く走っているとき(30km/h)の電圧と速度の関係は
そして中くらいのスピードより若干速く走っているとき(80km/h)の電圧と速度の関係は と、このように○○km/hによって電圧も変化していきます。 正確に言うと 現在の電圧=現在速度÷最高速度 というふうになりますが、ぶっちゃけこんなことイチイチ考えるのはアホらしいので、簡単にまとめると。
こんな感じに見てもらえればOKです。
ちなみに、何故速度と電圧が関係しているのかというと、Nゲージを含む小型鉄道模型の殆どはレールから電気を得て走っています。
![]() ちょっと一息、トワイライト さて、実際にSetTimerVoltageを使ってみます。
走ってきた列車が10秒後に停車するとしましょう。
最初の0.0は電圧0.0つまり速度を0km/hにしろ(=停車しろ)となるわけです。 2つ目の10000は10000ミリ秒、これを普通の秒にするには1000で割ればいいので10000÷1000=10となり、10秒を表します。 これで10秒後に速度0km/hにしなさいと命令しているわけです。 具体的に例を挙げて言うと時速20km/hで走ってきた列車がこのセンサーを踏んだ場合、1秒間に2km/hずつ減速して10秒後に停車します。 ではさっそくこの命令を組み込みますが、これ1行だけ書いてもビュワー起動時に1回だけ”停車しろ”と命令するだけなのでBeginFunc-EndFuncで固めます。 この機能(BeginFunc-EndFunc=メゾット)の名前は”停車しろ”という内容ですのでstopとでもしておきます。
●編成のスクリプト
この命令を列車がセンサーを踏んづけたときに発動すればいいわけです。 先回のスクリプトが”列車がセンサーを踏んだときに警笛を鳴らす”であったので、これを改造すれば簡単にできそうです。
先回のスクリプト
一部記述を変更しています。
つまり"列車がセンサーを踏んだときに警笛を鳴らす"を"列車がセンサーを踏んだときにstopを発動する"に変えてやればいいわけです。
●センサーのスクリプト
ressyaのkeitekiを発動しなさいという命令をressyaのstopを発動しなさいに変えるだけです。 この辺の細かいことは先回を参照して下さい。
それではこれを編成、センサーに書き込みます。
さて、列車が停車した後は”6秒後に発車しろ”という命令文を書けばいいわけです。 停車しろというスクリプト
をいじっていきます。
●編成のスクリプト
こうすれば列車は10秒後に中くらいよりも若干遅いスピードになります
この機能も付け足せばいいので最終的に編成のスクリプトは以下のようになります。
つぎに、センサーのスクリプトを記述します。
これに、発車しろと付け加えたものは
となりますが、これではセンサーを踏んだ瞬間に「停車しろ」と「発車しろ」の2つが発動され、編成は大変困ってしまいます。
そこで次に「6秒後に」という部分を作っていきます。
とまぁぱっと見ただけではかなり難しそうなな内容ですが、一つずつ整理していくと分かり易くなります。 1行目SetEventAfterの右に書かれている単語に注目して下さい。 つまり、これら”オブジェクト参照 メソッド イベントIDを受け取るグローバル変数 時間”の4つのものを用意すれば良いわけです。
まず、”イベントIDを受け取るグローバル変数”はとりあえず無視して下さい。
”時間”の部分は”何秒後に・・・”の部分なのでここはOKですね。
つぎに”オブジェクト参照、メソッド”の部分ですが、ここでcallの内容を思い出して下さい。
とあるようにほとんと同じ内容になっております。
つまり
ここでオブジェクト名またはオブジェクト変数=オブジェクト参照、メソッド名=メソッドなので
とこのようにSetEventAfterが必要とするもの=callが必要とするもの+時間となっております。 つまり
これに”6秒後に”という部分を付け足すにはSetEventAfterを使って
こうしてやれば”6秒後にressyaのlowという機能を発動しろ”となるわけです。
さて、とりあえず無視したイベントIDを受け取るグローバル変数をこれに付け加えていきます。
まずtievは変数だと宣言します(tiev:time eventの略記)
んで、このtievをメゾット(=low)と時間(=6000)の間に入れてくれとマニュアルに書かれているので、最終的に
これでressyaのメゾットlowを6秒後に発動しろという命令文になるのです。 ちなみにこのtievはセンサーのときのやつとおなじくKillEvent系列で使うもので、とりあえずいる物と考えて下さい。 さてさて、これでセンサーのスクリプトはこのようになりました。
●センサーのスクリプト
これをセンサーのスクリプトに書けば晴れて自動運転の完成・・・・・・・
一旦は減速しはじめるのですが再び加速しだしてしまいます。 ここでまず、停車するメゾットstopの中身を思い出して下さい。
これは”10秒後”に速度が0になる命令文でした。
さっきセンサー書いたスクリプトはセンサーを踏んだ瞬間に”stop発動”と”6秒後にlow発動”が同時に命令されたわけです。
というわけでセンサーのスクリプトは以下のようになります。
![]() 列車が停車した後発車しました。
これで自動運転ができました。
次回は自動折り返し運転に挑戦します。
|