2006/10/21

【何か】シリーズを作ってみよう(その10)  【何か】スクロール
前回へ戻る>

今回はメソッドsubSpeedの中身を解説します。このメソッドは、【何か】センサーのパラメーターから指定された「到達速度」と、前回組み込んだparamセクションから得られる「加減速性能」を元に、「加減速所要時間」を自動的に算出し、実際に加減速をおこなうメソッドになります。

まず、登場する数値の関係を抑えておきましょう。

加減速所要時間(秒)=加減速する速度差(Km/h)÷加減速性能(Km/h/s)

です。「加減速性能」とは、1秒あたりに加減速可能な速度でした。「加減速する速度差」を加減速性能で割れば、加減速に何秒かかるか、すなわち「加減速所要時間」がわかります。

加減速する速度差、とは「到達速度」と「現在速度」の差、つまり、この2つの値を引き算したものです。引き算の結果は場合によってはマイナスになりますから、絶対値(±の符号を取り除いた数値)を使う必要があります。加速と減速の差はあれども、速度変化の所要時間は常にプラスになりますので。

では、これをスクリプトで書いてみましょう。

BeginFunc subSpeed
//
//VarParameterの速度まで加減速するメソッド
//
//一時変数宣言
Var TmpSpeed
Var TmpTime
Var TmpCurrentSpeed
Var TmpTopSpeed
//整数→小数変換
cnvfloat VarParameter
//現在速度取得
GetCurrentSpeed TmpCurrentSpeed
//速度差算出
mov TmpSpeed VarParameter
sub TmpSpeed TmpCurrentSpeed
if TmpSpeed //速度差があれば以下の処理を実行
//加減速所要時間算出
abs TmpTime TmpSpeed
div TmpTime WizAcceleration
mul TmpTime 1000.0
//小数→整数変換
cnvint TmpTime
//最高速度取得
GetTopSpeed TmpTopSpeed
//電圧算出
mov TmpSpeed VarParameter
div TmpSpeed TmpTopSpeed
//速度変化実行
SetTimerVoltage TmpSpeed TmpTime
endif
EndFunc

上掲のメソッドsubSpeedを前々回に示したメソッドmainの後に追記します。


ここに至る流れをおさらいしておきましょう。【何か】センサーから得たパラメーターが0〜300の場合、これを到達速度と解釈してグローバル変数VarParameterに記録し、メソッドsubSpeedがcallされる、というのがメソッドmainの動作でした。つまり、上掲のメソッドが実行される時点で、変数VarParameterには到達すべき速度が収められている、ということです。これを頭に入れて、メソッドsubSpeedの中身を読んでいきます。

まず、冒頭で4つのローカル変数を宣言します。このメソッドの目的は、末尾の“SetTimerVoltage”命令に適切な「電圧=速度」と「加減速所要時間」を与えて編成の速度を変えることです。“TmpSpeed”が電圧、“TmpTime”が加減速所要時間を収めるべき変数になります。つまり、ここからSetTimerVoltage命令までのスクリプトは、TmpSpeedとTmpTimeを計算するために存在する、ということです。“TmpCurrentSpeed”と“TmpTopSpeed”は、その過程で必要となる「現在速度」「最高速度」を収めるための変数です。

次に“cnvfloat”命令で、変数VarParameter(この時点では整数扱い)を小数に変換しています。VRMスクリプトの世界では、電圧=速度は小数で扱うのが定石でしたね。

続いて“GetCurrentSpeed”命令で、編成の現在速度を変数TmpCurrentSpeedに取得します。この値とVarParameterを引き算(“sub”命令)すれば「加減速する速度差」を得ることが出来ます。但し、VarParameterの値は後で電圧を算出するのに必要なので、一旦“mov”命令で、TmpSpeedに内容を移してから計算をおこなっています。

続く“if TmpSpeed”は、TmpSpeed(到達速度−現在速度)が 0 でなければ以下を実行せいよ、という意味になります。TmpSpeedが0ということは、到達速度と現在速度が等しい、つまり加減速をする必要がないことになりますから、以降の処理はSetTimerVoltage命令を含めて実行する必要がありません。なので、対になる“endif”命令は、最終行にあります。

TmpSpeedが0でないとすれば、そこにはプラス(到達速度の方が現在速度よりも大きい)またはマイナス(その逆)の値が収められているはずです。これを“abs”命令で絶対値化して変数TmpTimeに収めます。すなわち「加減速する速度差」です。これを「加減速性能」で割れば、「加減速所要時間」になるんでしたね。

割り算は続く“div”命令です。TmpTimeを“WizAcceleration”で割ります。このWizAccelerationの部分には、前回記述したparamセクションによって、ユーザー(スクロールを組み込む人)が入力した加減速性能が入ります。これでTmpTimeに加減速所要時間が入りました。但し、この時点では単位が「秒」です。SetTimerVoltage命令が必要とする時間の単位は「ミリ秒」ですので、この単位変換のために1,000倍しているのが続く“mul”命令です。さらに、VRMの世界では時間は整数扱いですので、“cnvint”命令で整数変換します。こうして、SetTimerVoltage命令が必要とする「加減速所要時間」を得ることに成功しました。

後は、“【何か】この速度で走れVer1.00”以来の「到達速度」と「最高速度」から「電圧」を算出する処理をおこない、最後にSetTimerVoltage命令にTmpSpeed(電圧)とTmpTime(加減速所要時間)を与えてやれば、この編成は所定の加減速性能に従って、【何か】センサーで指定した到達速度を目指して加速、または減速することになります。

いかがですか。全体をバッと一望すると難しそうに見えるVRMスクリプトですが、こうして一行ずつ解説していくと、それぞれの行でやっていることは実につまらないことであり、また、行と行のつながりも、極めて当たり前な理屈の連なりであることがご理解いただければ、と思います。まぁ、それが理解できたから自分で書けるか、というと、それはまたちょっと別の話のような気もしますが。

次回へつづく>
0

コメントを書く

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




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