Rosso Laboratory

Rosso Laboratory

主に鉄道模型シミュレーター(VRM)などの仮想鉄道アプリを扱うブログです。またHDR写真の記事も書いています。

SearchPointの使い道

この「SearchPoint」の使い方は「cVss」の動作の中核の1つであります。よって、今後「cVss」を改造して利用する上では概念的な事を知っておかないと辛いだろうと思いますので、図も加えながら書いておこうと思います。

VRM入道「SearchPoint命令にやっぱり使い道がない件」を見て、「SearchPoint」が使えない命令だという認識のままのユーザーもいらっしゃるかもしれませんが、そんなことはありません。以前は確かにポイントに接続されたレールの範囲までしか検知できなかったので「vrm4cv用スクロール開発計画」からghost氏は撤退した訳ですが、今はその制限が解除されていますので、十分使えるものになっています。

ここでちょっとだけ以前の記事の補足をしておくと、junichi氏から指摘されたのですが、編成スクリプト内の
//----------------------------------------------------------------------
//ユーザー設定項目
  //SearchPointの探索範囲(通常は変更する必要なし)
    setf VarSearchPointRange 256.0
//----------------------------------------------------------------------

に「SearchPoint」の探索範囲が設定されていますので、場合によっては、この数値を変更する必要があります。

それでは、「SearchPoint」の有用性について書きます。

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

「センサーが編成を検知したら、前方にあるポイントを分岐方向に切り替える」

ということを実現しようとすると、通常は、



このように、センサーからポイントのメソッドを呼び出して実行するという形が一般的でしょう。スクリプトにすると、

<センサー>
//ポイントを直進方向にするメソッドへ
BeginFunc MethodSensorEvent
  call "ポイント01" MethodPointBranch1
EndFunc


<ポイント01>
//ポイントを分岐方向に設定するメソッド
BeginFunc MethodPointBranch1
  SetPointBranch 1
EndFunc


こんな感じです。

しかし、この実現方法は汎用性という面で劣ります。理由は、センサーに"ポイント01"という部品の固有名が使われているからです。

"ポイント01"という部品の固有名を使ってしまった為に、このセンサーは"ポイント01"専用としてしか使えず、更には"ポイント01"はレイアウト全体を通してユニーク(唯一無二)な名前にしなければなりません。故に、コピー&ペーストだけで使い回すということが出来ず、イチイチ名前を変える必要に迫られ、扱いづらいのです。

これが「部品名で参照することによる汎用性の低下」ということです(後日説明しようと思いますが、これはオブジェクト指向の概念でいくと、既にインスタンス化されてしまっている状態とも言えるんじゃないでしょうか)

さて一方、「SearchPoint」を使うと



このように複雑なやりとりが発生します。スクリプトにすると、

<センサー>
//ポイントを直進方向にするメソッドへ
BeginFunc MethodSensorEvent
  GetSenseTrain ObjTrain
  set ObjTrain VarAutoPointOrder 1
  call ObjTrain MethodAutoPointBranch
EndFunc


<編成>
//CV標準化自動合流ポイント用メソッド
BeginFunc MethodAutoPointBranch
  SearchPoint VarSearchPointRange ObjPoint
  if VarAutoPointOrder
    call ObjPoint MethodPointBranch1
  else
    call ObjPoint MethodPointBranch0
  endif
EndFunc


<ポイント>
//ポイントを分岐方向に設定するメソッド
BeginFunc MethodPointBranch1
  SetPointBranch 1
EndFunc


となり、少々面倒なことに見えることでしょう。

これは、センサーから直接"ポイント01"に命令を与えるのではなく、編成に対し「今、発見できるはずのポイント」の動作用判断の値を与えた上で、ポイントを発見し命令するように指示しているのです。VarAutoPointOrderという変数がその器です。そして編成は「SearchPoint」で自らポイントを発見し、編成からそのポイントのメソッドを呼び出して実行させているのです。

ご覧のように、こちらのスクリプトには"ポイント01"という部品の固有名は一切出て来ません。何故ならば、「SearchPoint」でオブジェクト参照値を取得しているので、部品の固有名で名前解決(識別判断)する必要がないからです。故にポイント名をユニークにする必要もなく、コピー&ペーストだけで使い回すことが出来るのです。

これが「汎用性を高める」ということです(これも後日説明しようと思いますが、これはオブジェクト指向の概念でいくと、よりクラスに近い状態にしているとも言えるんじゃないでしょうか)

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

今のところ、信号機・踏み切り・音源・単線はコピー&ペーストだけでは出来ないということを以前書きましたが、要するにこれらの部品や構造は、現状では部品の固有名で名前解決する必要があるからです。言い換えれば「SearchPoint」のようなオブジェクト参照値を取得する方法がないからです。

なので、センサーに機能が追加されるならば、

信号機・・・信号機~センサーのリンク
踏み切り・・踏み切り~センサーのリンク
音源・・・・音源~センサーのリンク
単線・・・・センサー~センサーのリンク


のような機能を部品レベルで追加してくれれば、コピー&ペーストだけで使い回せるものも開発可能だろうということです。

さて、センサーの機能追加はどうなるんでしょうね?

これに加えて、「センサー1個での進入方向検知」や「スクリプトに設定したユーザーパラメーターをダイアログ上で書き換えられる機能」が付いてくれると嬉しいところなんですが。

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

と、上記の記事を書いたのが数日前なんですが、本日3/9のIMAGIC Blog「自動センサー開発中」を見ると、結構イイ線いっているんじゃないかなと思っています。「センサー~センサーのリンク」は未だ判らないですし、「ユーザーパラメーターをダイアログ上で書き換えられる機能」はちょっと無さそうですが、それ以外は出来そうな感じ。

<2009/3/9 18:25追記>
ん?まてよ。ダイアログで指定しているということは、部品名のユニークさからは脱却してないのか? これじゃコピペでは使えんな。使えるのは方向性だけか?