![]() |
![]() |
この文章を書いた時点でのVRM4のバージョンは「4.0.1.1」です。これ以前のバージョンでは間違いなく動作しません。また、今後のバージョンアップによって仕様が変更される可能性もあります。 |
いきなりこれかい!という声が聞こえてきそうですが、これです。
VRM4第1号の目玉の一つが連結・解放ですね。すでに色々試された方はお分かりだと思いますので、連結するにはスクリプトは不要だとか、V2やV3の車輌でも連結・解放できるとか、前置き的な説明は省きます。「解放」するにはスクリプトが必要ですので、さっそくこれをやってみます。
//編成スクリプト(一部) VarTrain NewCar Var k set k 1 BeginFunc T_Kaihou Uncouple k NewCar EndFunc |
解放命令(Uncouple)は編成スクリプトに書く必要があります。詳しい使い方はマニュアルを見てください。上の例では2両目以降を解放しています。さて、このメソッドは言わば「結果」になりますので、これを引き起こす「原因」を作ってあげないといけません。キーボードの「k」キーを押したら解放する、とするなら、レイアウトスクリプトに以下を書けばよろしい。
//レイアウトスクリプト(一部) Var ID0 SetEventKey this Kaihou ID0 k BeginFunc Kaihou call "YOURS" T_Kaihou EndFunc |
ここで、"YOURS"というのは編成名です。
レイアウトはこんなもんです。「S」には、機関車の前に客車が2両繋がった編成があります。動きとしては以下の通りです:
(1)最初のセンサで列車は一定速度まで加速されます。
(2)青で「センサ」と書かれた位置で客車を分離します。下の写真では、列車は手前から向こう側に走っており、今しも客車を切り離したところです。
(3)客車はそのままの速度を維持し、ポイントの手前で少し減速、「P」の引き込み線に入った後、さらに減速して停止します。現実的には惰性で走っているので徐々に減速すべきですが、まあ、そこまでリアルに作る必要もないでしょう。
(4)一方、機関車は解放後急激に減速し、客車の後を追い掛けます。客車が引き込み線に入ったのを確認するまでポイントの手前で停止します。その後、徐行して「L」の引き込み線に入ります。
スクリプトについては、今までやったスクリプトと変りませんので、概要と注意事項だけ書いておきます。編成スクリプトには、以下のようなメソッドがあります:
S60km:「SetTimerVoltage」を使った速度調節用です。S60kmというのは文字通り速度を60km/hにします。
V60km:やはり速度調節用ですが、「SetVoltage」で加減速時間なしに変更します。
T_Turn:編成を方向転換します。
T_Kaihou:解放します。客車と機関車を分離しますので、解放位置は前から3両目を指定します。また、解放後の新編成を「EF81」という名前でレイアウトスクリプトに引き渡しています。
次に解放の「原因」を書きますが、今回は列車がセンサに検出されたことがトリガーになります。あとあとのことを考えると、レイアウトスクリプト(言わばメイン関数)で処理を行うべきですが、今回は一発芸的な動作ですので、このセンサに全ての処理をさせてしまうことにします。リストは以下の通りですが、解説の為に行番号や色を付加してあります。
//センサスクリプト |
まずは、黒字の文だけを追い掛けてください。9行目までは宣言で、センサが列車を検出すると「Kaihou」メソッドが起動します。
11:検出した列車を変数に格納します。
16:ここでポイントを制御しています。まずは客車を目的の引き込み線にぶち込みますので、そのようにポイントを切り替えます。ポイントには切り替え用のスクリプトが記述してありますが、これは以前やったものと同様です。
17〜20:列車を一旦、停止させてから、解放して、再び元の速度(60km/h)で走らせています。走行中に解放しても問題ないようですが、ここでは念の為一旦止めています。但し、「SetVoltage」で制御していますので、この数行は一瞬の内に処理され、結果、走行中に解放しているように見えます。また、「V60km」で走らせているのは「SnsTrain」つまり、分離した前方に位置する客車です。
23:分離した後方の列車(機関車=NewTrain)も走らせないといけませんが、60km/hで走らせると、前の客車にぶつかってしまう恐れがあるので、36km/hにしました。実車では機関車は急ブレーキを掛ける訳ですが、まあ、こんな風なプログラムでも実行してみると、それなりの動きに見えます。
24:おまけのメッセージです。
さて、ここで緑色の命令についてです。21行目と22行目で「Turn」させていますが、2回方向転換すると元に戻るだけなのになぜこんなことをしているのか‥‥‥ここで重要な注意事項です:
こういうことは、深く考えてはいけません。色々やってみて、なぜだか分からないけどうまくいったのなら、それが正解です。 |
スクリプトには正解というモノはありません。だから、スクリプトを教えてくださいという問い掛けはナンセンスです。なんでもいいから、思った通りの動きをするのならそれでいいのです。
青い命令はメイン関数に引き渡す Train変数の処理です。この点については、マニュアルにある注意事項の通りです。編成・センサ・ポイントで共通したTrain変数を扱う必要があるからです。
赤い命令:このセンサに(分離前の)列車が検出されると解放が行われますが、その後で、分離された機関車が再びこのセンサの上を通過することになるのです。そして、その機関車に対してもこの解放メソッドが働いてしまう訳ですね。これを防ぐために、赤色の命令を追加しました。本来は、Train変数同士を if文で比較したかったのですが、なぜかエラーになってしまいます。仕方ないので、「i」というフラグを用いてお茶を濁しました。
他にもいくつかセンサがありますが、ポイントを切り替えたり、速度を制御したりするものですので、実際のレイアウトでご確認ください。
ビューアーを起動したら、「↑」キーを使って列車を少し走らせてください。キュービクルが置いてある位置までくると、あとは自動で運転します。カメラの制御は行っていませんので、自由に切り替えてください。運転前にフライスルーカメラにでも切り替えて、解放位置(農家があります)まで移動して待ち構えているのがいいでしょう。
レイアウトデータダウンロード:Toppou.LZH、321kB