2008/8/21

忘れてるんじゃなくて、そもそもわかって・・・いや、何でもありません、モゴモゴ  VRMスクリプト禅問答
【怎麼生】

http://caldia.blog.shinobi.jp/Entry/238/

【説破】 4.0.9.8

その1。SetEventTime/After/Timer命令の第4パラメータ(時間)は変数に対応していません。SCRIPTマニュアルの記述上も、変数が使えるとは書いてありません(使えない、とも書いてありませんがw)。加えて、VRMビュワー起動時のスクリプト文法チェックは甘々で、しばしば変数対応していないパラメータに対して書かれた変数名を無視し(エラーにならずにビュワーが起動してしまう)加えて、該当部分を勝手に“0”と解釈して動作しているように見えます。

で、SetEventTime/After/Timer命令が、第4パラメータが0(ミリ秒)の場合にどのような挙動を取るかはソースコードを読まないと何とも言えませんし、ボクの記憶が正しければ、4.0.1.x時代は何も起きませんでした。が、字義通りに解釈すれば、Caldia氏がやったことは「0秒毎にメソッドを実行しろ」という意味になりますから、まぁ、おかしなことが起こっても驚くには値しません。以上。

その2。簡単な実験をしてみましょう。何でもいいので、適当なオブジェクトに以下のスクリプトを書き込み、ビュワーを起動してみてください。
DrawMessage "ちょっとしたテスト"
すると、起動したビュワーのログウィンドウに以下に示すような表示が現れるはずです。

クリックすると元のサイズで表示します

この実験でわかるのは、宣言部(メソッドの外側)に書かれたスクリプト命令の処理が実行されるタイミングは、“VRMViewer V4”が“Startup OK”するよりも早い、ということに尽きます。

続きを読む
0

2008/8/4

SetEventMPStart/Stopから広がる妄想  VRMスクリプト禅問答
どちらかと言うと中の人向けメモ、オマケつき。

続きを読む
0

2008/3/11

VRM4に実装して欲しい命令いろいろ  VRMスクリプト禅問答
チラシの裏的備忘録。

●おそらく簡単に実装できて、それなりに効果があるもの

【編成】GetTurnStatus [Variable(int)]

ビュワー起動時の先頭車方向へ向けて走行しているか、あるいはその逆かを取得する。要するに、[Home]キーを押した回数+Turn命令を使った回数の合計が偶数か奇数か、ってだけの話。

【編成】GetMe [Variable(train)]

この命令が実行されたコンテキストが所属する編成オブジェクトを取得する。こちらのエントリで言及したObjMeに相当。要するに動的なthis。

【ポイント】SetEventBranchChange [Method] [Event Handler]

ビュワーメニューまたはSetPointBranch命令によってポイントが切り替わった際に、任意のメソッドをトリガするイベント設定。コレとかコレでやっている“タイマーイベントでGetPointBranchの値を監視する”って手法は、あまりスマートでないので。

【信号】SetEventSignalChange [Method] [Event Handler]

SetSignal命令によって信号灯火が遷移した際に、任意のメソッドをトリガするイベント設定。ポイント位と異なり、信号遷移はスクリプトでしか起きないのでSetEventBranchChangeほどの重要性はないが、これがあれば、区間閉塞や中継信号その他を実現するために、無駄なタイマーイベントやアドオン記法を弄せずに済む。

●実装が厄介そうだけども、あれば面白くなりそうなもの

【編成】GetGradientRatio [Variable(float)]

先頭台車が乗っているレールの、両端の高さの差÷レール長(つまり勾配率)を取得する。GetDirectionの値と合わせて評価すれば、上ってるか下ってるかもわかる、みたいな。後述するSet/GetAccelerateと対で使う想定。

【編成】Set/GetAccelerate [Variable(float)]

直接的には、トラコンモードでノッチが入っていないときの減速率を設定/取得する。ノッチに応じた加減速に影響するならなおベター。前述したGetGradientRatioと組み合わせて使うことで、下り坂で加速し、上り坂で減速するギミックを実現できる。

【編成】Set/GetTrainCameraRoll [Variable(float)]
【カメラ】Set/GetCameraRoll [Variable(float)]

カメラの左右への傾き角を設定/取得する。値はラジアンか。取得はなくてもいいような気もするが、カントレールが使われていれば、編成が曲線を走行中か否かをスクリプトで知ることが出来る(編成先頭が振り子車かどうかも判別できるわな)というオマケが付く。何の役に立つかは別にして。

【全般】GetObjectPosition [Variable(Object)] [Variable(vector)]

任意のオブジェクトの座標をベクトル変数に取得する。出来ればすべてのオブジェクトに対応して欲しいが、とりあえず編成と車両(いずれも進行方向台車座標でOK)に対応してくれれば神。あとは適当に何とかする。

●とりあえず、とっととリファレンスの記述通りに動くようにして欲しいもの

【編成】SearchPoint
【編成】SetTopSpeed
【編成】AutoSpeedCtrl

コイツらが放置状態な現状では、上に書いたような要望も虚しいわな。っつーか、対応する気がないならないで、中の人にはその旨を明言して欲しい。そのくらいしても罰は当たらんだろう。

と、アウトプットしておかないと忘れそうなので、チラシの裏的に書き出してみた。まぁ、実装されたところで、ボクしか使わないんだったら意味ないけど。
0

2008/3/6

編成スクリプト中のthisの話  VRMスクリプト禅問答
結論から言うと、厳密には編成スクリプト内でcall/SetEvent〜命令のパラメータにthisは使わない方がいい、という話。まぁ、言っているボクもそこまで徹底してませんが、来るべき次期自動運転スクロール/フレームワークでは、以下に紹介する方法論を採用したいと思ってます。

*     *     *

まず、基本的なところをおさらいしておきましょう。たとえば“TRAIN1”と命名された編成があるとします。ここに以下の編成スクリプトを書いたとします。
<編成スクリプト>

BeginFunc MtdA
  call this MtdB //thisのMtdBをcallする
EndFunc

BeginFunc MtdB
  SetTimerVoltage 0.0 10000 //10秒かけて停車する
EndFunc
まぁ、普通は書かないスクリプトですが、説明の便宜上こうしておきます。要するに、メソッドMtdAを何らかの方法で実行すると、メソッドMtdBがcallされ、編成が停車する、という流れです。

さて、メソッドMtdAを実行すると常に編成は停車する、と言えるでしょうか。答えはNoです。これは特別な識別子であるthisの挙動によるものです。thisは、ビュワー起動時に「thisが書かれた部品の名前に読み替えてコンパイルされる」という性質を持っています。従って、編成以外の部品であれば、上に示したサンプルスクリプトは常に意図通り動作します(SetTimerVoltageは編成部品以外に書いても意味がないですけども)。

しかし、編成部品についてはこれが成り立ちません。問題になるのは、編成の分割と併合に際してです。

続きを読む
1


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