地味なスクリプトネタが続きます(笑)。
USO800鉄道氏に依頼された「極低定速度揺動カメラ」(数値制御で非常にゆっくりと揺動させることが出来るフライスルーカメラ)の全文を掲載しようかと思ったのですが、若干不安があるため保留。替わりにそのスクリプトの中で使っている「For~Nextループ文をVRM4スクリプトで再現したもの+α」を紹介します。これがあれば、単位円と回転行列を使ってすぐに作れる程度のものですし。
「For~Nextループ文」とは、BASIC等でお馴染みの
//----------------------------------------------------------------------
For i=0 to 100 step 2
(ループさせる実行命令群)
Next i
//----------------------------------------------------------------------
というコレ。日本語訳すると「まず変数iに0を代入してNextが出たら戻り、iに+2して、iが100になるまで繰り返せ」といった感じ。で、VRM4スクリプトではこのようなループ命令は提供されていないので自分で作ることになります。
コレをVRM4スクリプトで再現すると、
//----------------------------------------------------------------------
//ループ処理構造
//----------------------------------------------------------------------
//変数宣言
Var VarCount
Var VarEnd
Var VarStep
Var KeyEventID
//スタート
set VarCount 0
set VarEnd 100
set VarStep 2
SetEventKey this MethodLoop KeyEventID 1
//メソッド
BeginFunc MethodLoop
:loopstart
//(ループさせる実行命令群)
DrawVar VarCount
add VarCount VarStep
if<= VarCount VarEnd
jump loopstart
endif
EndFunc
//----------------------------------------------------------------------
こんな感じになるでしょうかね(キー実行の部分は余計だけど)。
しかし、配列変数が提供されていないVRM4スクリプトでは、瞬時に終わるこのループ文に何の使い道があるだろうか?と考えると、いまひとつ使い道が思い浮かばないところです(列車運行管理システムとかを作ろうと思ったら、1次だけでも良いので配列変数は必要になるだろうと思うんだけどねぇ。そこまでの需要はやっぱりないか)。更には、あまり使わない方が良いとされるjump命令(BASICでいうところのgoto)も使っているので、まぁ何かに使える日が来るかもしれないですが、積極的に使うべきでもないということになるでしょう。
そこで、これにwaitを付加しましょう。sleep関数みたいなものはVRM4スクリプトにはないので、SetEventTimerを使います。ここでSetEventAfterを使うと多分面倒なことになりそうだから(笑)。
//----------------------------------------------------------------------
//wait付ループ処理構造
//----------------------------------------------------------------------
//変数宣言
Var VarCount
Var VarEnd
Var VarStep
Var TimerEventID
//スタート
set VarCount 0
set VarEnd 100
set VarStep 2
SetEventTimer this MethodLoop TimerEventID 1000
//メソッド
BeginFunc MethodLoop
//(ループさせる実行命令群)
DrawVar VarCount
if>= VarCount VarEnd
KillEvent TimerEventID
endif
add VarCount VarStep
EndFunc
//----------------------------------------------------------------------
という訳で、これが「極低定速度揺動カメラ」に使われた構造です。ポイントはループを終了させる時にKillEventを使って脱出しているところぐらいでしょうか。こちらの方が如何にもVRM4スクリプトっぽいという感じがしますな。また、ループ実行が結局時限式にもなるので、時間(=ループ回数)も取得出来るから、こちらは色々と使い道はありそうな感じがします。
既に大分長くなったし、誰も読んでいないような気もするので次回に続く・・・必要があるのか?