2007/2/22

編成を名前で参照するのは避けた方がいい件  VRMスクリプト禅問答
「今日はこの編成を走らせてみよう」というような遊び方は難しいということですね。
スクリプトを差し替えた編成にも組み込めばいいのでしょうが、ポイントなどのスクリプトも、やり直しになってしまうと言う事になってしまいますよね・・・

について。

鉄道模型において情景(レイアウト)と車両(編成)の組み合わせは自由です。もちろん、この風景はあの場所を模したものだから、走る列車はコレでなければならない、とおっしゃる方もおいででしょうが、それはまぁ、個人的な好みと言うかこだわりであって、普遍的なものではないでしょう。

さて、我らがVRM4でも、もちろんどんな情景にどんな車両を走らせるかは自由ですが、スクリプトが絡んでくると、少し話が変わってきます。上引用でmarlboro_vrm氏が言っているのがそれです。

結論から先に申し上げると、製品付属のスクロールは、サンプルという位置づけからか、後述するような配慮がなされていないものがあるため、ここで目指す“今日はこの編成を走らせてみよう、というような遊び方を可能にするレイアウト”を実現するには不向きです。

その“配慮”というのが、エントリタイトルに掲げた「編成を名前で参照するのは避けた方がいい」です。製品付属のスクロールは、結構平気にこれをやっているので、結果的にmarlboro_vrm氏が言うように「ポイントなどのスクリプトもやり直し」になってしまいます。具体的には以下のようなスクリプト記述がそれに当たります。

//編成名参照による編成メソッドの実行
call {編成名} {メソッド名}

//編成名参照によるセンサー検知編成のチェック
VarTrain ObjTrain
GetSenseTrain ObjTrain
ifeq ObjTrain {編成名}
 //編成名が一致したときの処理
endif
上の二例に共通しているのは、編成の名前を部品(主にセンサー)スクリプト内で使っていることです。これは、{編成名}の編成がレイアウト上に存在しなくなる=他の編成に置き換えると、エラーになってビュワーが起動できなくなることを意味しています。

製品付属のスクロールに限って言えば(具体的に該当するのは“指定の列車でポイントを直進/分岐に切り替える”、“列車がセンサーを通過したら速度を調整”、“センサーで列車を自動折り返し運転”、“列車がセンサーを通過したら警笛を鳴らす”などです)実は編成の中身=車両だけを置き換えて、編成の名前とスクリプトをそのままにすれば(編成が展開可能な長さでさえあれば)実はちゃんと動作します。

だから問題はない、と言えなくもないですが、現実には、大抵のユーザーは編成名にその列車の名前を使うでしょう。当然、列車の名前はそこで使われる車両と密接に関係していますし、しかも編成名は運転中にビュワー左下に表示されるので、これが違っているのは許せない、というのがユーザーの偽らざる心情かと思います。

この問題を回避する最善の方法は、スクリプト内で編成名を使うのを一切やめてしまうことです。具体的には、

・可能な限り、編成のメソッドは編成自身からthisを使ってcall/SetEvent〜する。
・編成のメソッドを他部品から実行する場合は、必ずセンサーからGetSenseTrain命令でTrain変数に取得した名前を使ってcall/SetEvent〜する。
・センサーが検知した編成が、目的の編成であるかを判定するには、編成名ではなく、編成に仕込んだグローバル変数の値を使う。(VRM4EG所収「スクリプトの教科書」実践編A“編成を識別する”に詳しい)
・編成から他部品のメソッドを実行する場合は、動的オブジェクト参照のテクニックを使う。(同上発展編“動的オブジェクト参照”に詳しい)

を徹底すれば、編成名が変わっても動作の変わらないスクリプトを書くことが出来ます。同じスクリプトを他の編成にコピー&ペーストすれば、編成名の異なる複数の編成に同じ動作をさせることが出来ますし、編成判別用のグローバル変数の値だけを変えれば、ある編成はポイントを直進し、ある編成は分岐するといった仕組みを実現できます。

これをスクリプトとして自分で書いたり、コピー&ペーストするのが面倒な人のために作ったのが、VRM4EG所収のgws/1.0規格自動運転スクロールです。手間味噌ながら、現時点において、ユーザー自身の手で(つまり、VRMシステム自体に改善を加えることなく)実現できる、この問題の解決の最適解であろうと思いますが、ボクの技量の限界ゆえに、VRMユーザー諸兄のご理解を得られぬまま忘れ去られようとしているのは、正直、無念ではあります。

どうにも、この話題を説明するのは難しいです。そういう意味で、marlboro_vrm氏の言う「今日はこの編成を走らせてみよう、というような遊び方は難しい」という指摘は正しいです。不可能ではないですが、難しい。あなたがそれをやるのも、ボクがそれをあなたに説明するのも、どちらも難しいです。

ただ、いつも繰り返し申し上げていることではありますが、具体的な課題(〜をしたい)を示して質問していただければ、それについての最適解をご説明することは難しくありません。むしろ、その積み重ね以外に、この話題について、ボクにとって説明の技術を磨き、皆さんにとってVRMスクリプトの技術を磨く方法はないと言ってもいいでしょう。まぁ、迂遠な話ではありますが、酔狂な方にはお付き合いしますので、いつでもどうぞ。
0

2007/2/24  11:40

投稿者:ghost
了解。>まるぼろ殿

2007/2/23  22:05

投稿者:まるぼろ
「まるぼろ」でお願いします。

2007/2/23  11:48

投稿者:ghost
> EG収録のスクリプトの実践のことなどをブログで書いたりしても良いものでしょうか?

一般的な刊行物に対する言及と同様にお考えいただければよろしいかと。引用も含めてご自身の責任においておこなわれる段には自由である、ということです。

ただし、私のこの返答を著者から得た特別な許諾である、と解釈しないでください。あくまでも一般論でお答えしたのみです。

ところで、ご芳名を表記する際は「まるぼろ」さんと書いた方がよいですか。本稿ではそれにまよったのでYahooでのID(ですよね?)の「marlboro_vrm」を使ったのですが。お返事をいただければ、今後は貴兄に言及する際、そのように統一しますので。

2007/2/23  0:16

投稿者:まるぼろ
できました!

ボクがやりたかったことほぼそのままです。
V3でいうところの列車番号でポイントが変わってくれるのとほぼ同じですよね??(誤解をしているかも知れませんが)

あまりにも早く買いすぎたVRM4EGが宝のもちぐされになっていました。(-_-;)

質問しますが、後々EG収録のスクリプトの実践のことなどをブログで書いたりしても良いものでしょうか?

コメントを書く

この記事にはコメントを投稿できません




teacup.ブログ “AutoPage”
AutoPage最新お知らせ