2005/8/21

GetDirectionの「向き」って・・・?  VRMスクリプト禅問答
【怎麼生】
GetDirectionで得られる値が、HOMEキーやTurn命令で方向転換していないにもかかわらず列車を走行させると変化しているようですが、なぜでしょう。

【説破】 4.0.1.2
私もコレコレを書いた時点ではこのことに気付いていませんでした。
GetDirectionの値は、HOMEキーによって変化する編成に対する進行方向ではなく、その列車が通過中の(厳密には1輌目の前輪が通過中の)レールの向きに対する進行方向のようです。よってその値は、編成を配置した地点においては編成進行方向と一致しますが、その走行中はレール配置に従って刻々と変化します。そのくらい書いといてよ、リファレンスに(苦笑)。
閑話休題。編成に対する進行方向に応じてヘッド/テールライトの状態や方向幕を変化させたい場合、GetDirectionの値を参照すべきではありません。現時点でVRM4スクリプトには本当の意味での「編成の向き」を得る命令がありませんので、これは別途ユーザーが変数で管理するしかありません。たとえば以下のような感じです。

(編成スクリプト)

//向き管理変数
Var StdVarDirection
set StdVarDirection 0 //0...正進 1...逆進
//方転検知
Var VarHomeID
SetEventHome MtdEventHome VarHomeID
//
//Homeキー押下時処理
//
BeginFunc MtdEventHome
call this StdMtdChangeDirection
EndFunc
//
//向き管理変数更新
//
BeginFunc StdMtdChangeDirection
if StdVarDirection
set StdVarDirection 0
else
set StdVarDirection 1
endif
EndFunc
上掲のサンプルスクリプトは「Homeキーを押す都度、向き管理変数StdVarDirectionの内容が0と1で交互に入れ替わる」というものです。これを仕込んでおいて、編成の向きに応じたアクションを起こしたい場合はif StdVarDirection〜else〜endifで対応します。
このサンプルでは、敢えて「Homeキー押下時処理のメソッド」と「向き管理変数更新のメソッド」を分けて、前者から後者をcallしています。これは、Homeキーを検知するだけでは実際には不十分だからです。現時点でVRM4スクリプトには「編成の進行方向が変わった際に発動するイベント」がありません。SetEventHomeは「Homeキーの押下」に連動するのみであり、具体的にはTurn命令による方転をとりこぼします。
この仕組みを編成に組み込み、かつTurn命令による方転制御をおこなう場合、Turn命令の直前または直後に必ずcall this StdMtdChangeDirectionを入れてください。これですべての方向転換を、確実に向き管理変数StdVarDirectionに反映することが可能になります。

と言うワケで、I.MAGiCの中の人におかれては・・・

- リファレンスにおける解釈の曖昧な表現の見直し
- 本当の意味での編成の向きを検出する命令の実装
- 本当の意味での編成の方向転換を検知するイベントの実装
- GetDirectionの使い勝手をあげるための、レイアウター上でレールの向きがわかりやすくなる何らかの工夫

あたりをよろしくお願い申し上げ候。
0

2005/8/21  0:18

投稿者:由羽
常々思うのですが。
中の人は「実装」の何たるかに対する認識が甘いんじゃないか
と。
特に組み込み系知ってる人から見ちゃうとorz
ただ、ユーザにとっても動作を見極める実験は必要かと。ユーザ
vs中の人の温度差と中の人の斬新さ(笑)をどう理解するかは難しい
問題かと思います(^^;

#フローティングウィジットは偉大だそうですが、無意味でした
orz

http://slashdot.jp/comments.pl?sid=166228&cid=516863

コメントを書く

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




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