2005/9/9

動的オブジェクト参照  VRMスクリプト禅問答
【怎麼生】
目指せ完全自動運転(5)で言及されている「他にもいろいろ応用の効く重要なテクニック」って、いったい何ですか?

【説破】 4.0.2.3
一言でまとめると「動的オブジェクト参照」です。

VRMスクリプトでは、あるメソッドが自分以外のオブジェクトの変数を知りたい場合「オブジェクト参照」と呼ばれる手法を用います。例えば、走行中の編成「TRAIN1」が前方にある信号「SIGNAL4」の変数VarSignalの中身を知りたい場合、
[編成スクリプト]
BeginFunc MtdBadSample
Var Tmp
mov Tmp "SIGNAL4".VarSignal
  ・
 (略)
  ・
EndFucn
とします。これは、ローカル変数Tmpにオブジェクト「SIGNAL4」のグローバル変数VarSignalの値を入れなさい、という意味になります。続けて変数Tmpをif系命令で評価すれば、TRAIN1はSIGNAL4の変数の中身を知り、それに応じて動作したことになります。
さて。上のような例で実際にはレイアウト中にはたくさんの信号があるはずです。それぞれの信号ごとにmov Tmp "SIGNAL1".VarSignal, mov Tmp "SIGNAL2".VarSignal.....とスクリプトを連ねるのは非効率ですし、まったく応用が利きません。そこで・・・
[編成スクリプト]
//公開プロパティ
VarSignal ObjSignal
//メソッド
BeginFunc MtdGoodSample
Var Tmp
mov Tmp ObjSignal.VarSignal
  ・
 (略)
  ・
EndFucn
とします。何をしたかと言うと、参照先のオブジェクト(前段のSIGNAL4)を直値ではなくオブジェクト変数に置き換え、さらにそれをグローバル変数として外部から参照可能にしたワケです。後は、列車の走行位置に応じてセンサー等から get {編成オブジェクト}.ObjSignal "{その時点で参照すべきオブジェクト}" とやってその中身を随時書き換えてやれば、このメソッドはセンサーを通過する都度参照する信号を変化させます。つまり、理屈の上ではレイアウト上に存在するすべての信号をたった1つのメソッドで処理することが可能になります。

このテクニックの応用例を1つ紹介しておきましょう。
[編成スクリプト]
//公開プロパティ
VarPoint ObjPoint
Var VarPointLR
//キーイベント定義
Var KeyIDq
Var KeyIDw
SetEventKey this MtdPointL KeyIDq q
SetEventKey this MtdPointR KeyIDw w
//左折メソッド
BeginFunc MtdPointL
ifzero VarPointLR
call ObjPoint MtdStraight
else
call ObjPoint MtdTurnout
endif
EndFunc
//右折メソッド
BeginFunc MtdPointR
ifzero VarPointLR
call ObjPoint MtdTurnout
else
call ObjPoint MtdStraight
endif
EndFunc

[ポイントスクリプト]
//正位切替メソッド
BeginFunc MtdStraight
SetPointBranch 0
EndFunc
//反位切替メソッド
BeginFunc MtdStraight
SetPointBranch 1
EndFunc

[センサースクリプト]
//パートナーポイント
VarPoint ObjPartnerPoint
get ObjPartnerPoint "{担当するポイント名}"
//右左折制御変数
Var VarPointLR
//この値が0ならば左折がポイント正位、1ならば右折がそれになる
set VarPointLR {0 または 1}
//センサーイベント定義
Var EventID
SetEventSensor MtdSenseTrain EventID
//列車検知メソッド
BeginFunc MtdSenseTrain
VarTrain ObjTrain
GetSenseTrain ObjTrain
get ObjTrain.ObjPoint ObjPartnerPoint
set ObjTrain.VarPointLR VarPointLR
EndFunc
編成スクリプトには、キーq/wを押すことで実行されるメソッドが定義されています。それぞれ、変数VarPointLRの値に応じて、オブジェクト変数ObjPointが指し示すところのポイントの正/反位切替メソッドを実行します。そして、これら2つの変数の中身、すなわち「どのポイントを切り替えるのか」「右左折どちらがポイント正位なのか」を意味する値は、センサーを踏んだ際に書き換えられます。
これによって何が起きるかというと、q/wキーを押すと、次に通過するポイントを「右折したいのか左折したいのか操作できる編成」が実現できます。まぁ、これは実際の鉄道ではあり得ない話ではあるのですが、鉄道模型的にはむしろ当然の話です。
加えて、この手法の面白いところは「編成の主観」からポイントを切り替えることができる点です。一般的に鉄道模型レイアウトのポイント操作はレイアウトを俯瞰した視点から「絶対的」におこなわれます。そのため、しばしば走行中の模型車輌と矛盾するポイント切り替えをしてしまい、脱線事故を起こします。このスクリプトにはそれがありません。運転台視点で、しかも自分から見て「右へ行くか、左へ行くか」を決めるからです。

この「どこに主観を置いて考えるか」という発想こそが、VRMスクリプトを制する上での1つの登竜門とも言えるのですが、雑多になるので後日改めて。気が向けば上掲スクリプトを自作レイアウトに組み込んで遊んでみてください。なお、説明を単純化するため逆走対策はおこなっていませんので悪しからず。
0

コメントを書く

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




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