Rosso Laboratory

PLAN-6 鉄橋通過音テストエディション Part-2

前回の続きですが、こちらは音とは全く関係なく、スクリプトに関する記事です。

先に書いておきますと、ややこしい話ですので今現在SetEvent系で苦労しているよという方以外にはあまりオススメできない内容です(笑)。また、SetEvent系はマスターしているぞという方には既に解っている内容かもしれないので、お暇ならお付き合いください。という程度のものです。

---*---*---*---


画面左の1面1線の駅を「駅A」、画面右の1面2線の駅を「駅B」とし、最初に走行している青い機関車を「編成1」、待機している赤い機関車を「編成2」とします。

-----------------------------------------------------
//「駅B」側センサーの停車反転呼び出しメソッド
BeginFunc MethodSensorEvent
 GetSenseTrain ObjTrain
 call ObjTrain MethodTrainEndrail
 //反対ホームの「編成」の再出発
 call "EH500-KeyQWER" MethodTrainTopSpeed
EndFunc
-----------------------------------------------------
//「編成」の停車反転メソッド
BeginFunc MethodTrainEndrail
 Var VarTime
 Var VarSpeed
 //時間(msec)は停車距離(mm)の1080倍の値に設定すること
 setf VarTime 54000.0
 GetCurrentSpeed VarSpeed
 div VarTime VarSpeed
 DrawMessage "第1編成-停車動作開始"
 setf VarVoltage 0.0
 SetTimerVoltage VarVoltage, VarTime
 SetEventZeroSpeed MethodTrainEndrail2 VarZeroSpeedEventID
EndFunc

BeginFunc MethodTrainEndrail2
 DrawMessage "第1編成-停車"
 Turn
 KillEvent VarZeroSpeedEventID
EndFunc
-----------------------------------------------------

<動作>
①「編成1」は鉄橋を通過した後「駅B」に到着。そこに配置したセンサーを踏んで停止反転。

②すると「編成2」が出発し鉄橋を通過した後「駅A」に到着。そこに配置したセンサーを踏んで停止反転。

その「駅A」の停止反転用センサーには「SetEventAfter」が使用され5秒後に再発車となる。

③「編成2」が「駅A」から再出発し「駅B」に到着。そこに配置したセンサーを踏んで停止反転

となるはずだったのですが、これがうまくいかなかったのです。「駅B」で停止はするが反転しない。よって、この後「編成1」が行って帰ってきて「編成2」が再出発するのですが、向きが正しくないのでアウトとなります。

そこでメッセージウィンドウのログを調べると、③の段階で「turn」を含む編成内のスクリプトがどうやら2回実行されているようでした。勿論、「駅B」にある停止反転用センサーでは2度も呼び出してはいません。追加したのは「駅A」における「SetEventAfter」を使った再出発なので、これを無効化し「駅A」からの再出発を手動にすると問題なく「駅B」で停止反転します。よって、「駅B」とは全く関係がないように見える「駅A」の「SetEventAfter」が悪さをしているのは明白でした。

そのスクリプトとは、
-----------------------------------------------------
//「駅A」側センサーの停車反転・再出発呼び出しメソッド
BeginFunc MethodSensorEvent
 GetSenseTrain ObjTrain
 call ObjTrain MethodTrainEndrail
 SetEventAfter ObjTrain MethodTrainTopSpeed EventID 5000
EndFunc
-----------------------------------------------------
で、編成のスクリプトの「MethodTrainEndrail」を呼び出して停止反転し、5秒後に編成のスクリプトの「MethodTrainTopSpeed」を呼び出して再出発する形です。

さて、VRMのスクリプトで訳のわからんトラブルが発生した時にはワンクッション置いてやると、うまくいったりすることがあるということを私は経験している(これが全てのケースでいえるかどうかは定かではないですが)ので、このメソッドから直接「MethodTrainTopSpeed」を呼び出すのではなく、別メソッドに一旦飛ばすということをやってみました。

それが、
-----------------------------------------------------
//「駅A」側センサーの停車反転・再出発呼び出しメソッド
BeginFunc MethodSensorEvent
 GetSenseTrain ObjTrain
 call ObjTrain MethodTrainEndrail
 SetEventAfter this MethodRestart EventID 5000
EndFunc

BeginFunc MethodRestart
 call ObjTrain MethodTrainTopSpeed
EndFunc
-----------------------------------------------------
です。ところが、これでも症状は直りません。そこで試しに「MethodRestart」に「KillEvent EventID」を付け加えてみたのですが、そうすると何故か「駅B」の停止反転用センサーが働かずに編成がエンドレールに突っ込む始末。

「「駅A」の部分を弄っているのに、全て「駅B」でトラブルを起こす。一体これはどういうことか?」となった訳で、ここで暫く一休み。根詰めてもドツボに嵌るだけなので一服して、ぼんやり考える。「メソッドを二段階にしてワンクッション置いてみたが駄目。ならば「SetEventAfter」も二段階にしてワンクッション置いたらどうだろうか?」

ということで、書いたスクリプトが
-----------------------------------------------------
//「駅A」側センサーの停車反転・再出発呼び出しメソッド
BeginFunc MethodSensorEvent
 GetSenseTrain ObjTrain
 call ObjTrain MethodTrainEndrail
 SetEventAfter this MethodRestart EventID 2000
EndFunc

BeginFunc MethodRestart
 SetEventAfter ObjTrain MethodTrainTopSpeed EventID 3000
EndFunc
-----------------------------------------------------
です。そして、これで問題は解決しました。めでたしめでたし。

で終わってしまっては、あまり意味がないので、「SetEventAfter」でググって理由が何かを調べました。すると、

VRM入道「編成を解結する話・追補」より

×誤解
・SetEvent~命令によって設定されたイベント(ある条件が整うと指定したメソッドを実行する仕掛け)は、SetEvent~命令が記述されたオブジェクトに所属する。

△新たな知見(暫定)
・SetEvent~命令の中でもオブジェクト参照が可能な命令(パラメーターを4つ要するもの/SetEventAfter, SetEventTime, SetEventTimer, SetEventKey)が設定するイベントは、命令が記述されたオブジェクトではなく、イベントによって実行されるメソッドが含まれるオブジェクトに所属する。


という記述がありまして、これで「「駅A」の部分を弄っているのに、全て「駅B」でトラブルを起こす」という理由は何となくわかります。どちらも編成のメソッドを呼び出しているからです。しかし、「SetEventAfter」で呼び出しているのは「MethodTrainTopSpeed」であり、問題を起こしているのは直前に呼び出している「MethodTrainEndrail」の方であるというのが少々疑問の残るところです。

結果からみれば、「SetEventAfter」で呼び出されたメソッドだけでなく、「SetEventAfter」を含むメソッド内で呼び出されたメソッドまで拡大して影響を受けているように思われるのですが、これが事実かどうかまでは調査しきれませんでした。で、これは恐らくVRM入道「編成を解結する話・その3」に書かれている現象と同じようなものじゃないかなぁと思っているところです。

結局のところ、二段階のメソッドにして「SetEventAfter」も二段階に分け、他のメソッドが影響を受けないようにすれば回避できるようだということが判っただけで、これが他のケースでも役に立つのかどうかはわかりませんが、まぁイイか。

そんな訳で少々(いや結構か)梃子摺ったというお話でした(笑)。

ランキングに参加中。クリックして応援お願いします!

名前:
コメント:

※文字化け等の原因になりますので顔文字の投稿はお控えください。

コメント利用規約に同意の上コメント投稿を行ってください。

 

※ブログ作成者から承認されるまでコメントは反映されません。

  • Xでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

最新の画像もっと見る

最近の「VRMスクリプト」カテゴリーもっと見る

最近の記事
バックナンバー
人気記事