2006/10/19

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

前回提示した課題のうち、1)複数の機能を1つのスクロールに実装する、に取り掛かることにします。まずは、作戦を練りましょう。

1つのパラメーターに複数の意味を持たせる例を通してご案内したように、【何か】センサーは-10,000〜10,000という、極めて無駄な幅のパラメーターが選択できる仕様になっています。“【何か】この速度で走れVer1.10”では、1,000を超える部分を加減速所要時間と解釈しましたが、Ver2.00では、加減速所要時間は編成毎に設定する「加減速性能」から算出する予定ですので、【何か】センサーから渡されるパラメーターを以下のように扱うことにします。

(A) 0〜300は編成の速度(実Km/h)と解釈し、速度変更の処理をおこなう。
(B) 301以上は停車位置までの距離(Nゲージmm)と解釈し、駅停車の処理をおこなう。
(C) -1以下も停車位置までの距離と解釈するが、駅停車に加えて方向転換の処理をおこない、往復運転/スイッチバックに対応する。

駅停車については、ついでなので再発車の処理も組み込んでみましょう。再発車させたくない場合は、パラメーターに0を指定した“【何か】センサー”を通過させる、とすれば、速度変化に関するほぼすべてのニーズに対応できそうです。

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

script WizObjTrain
{
//プロパティ
Var nanikaVarParameter //パラメータ受取用
Var nanikaVarDirection //進行方向取得用

//↑ここまで
//↓独自の初期化処理(グローバル変数宣言等)はここで

Var VarParameter //パラメータ保存用
Var VarFlag //折り返し運転フラグ


//↑ここまで
//↓以下は書き換えてはいけない!

BeginFunc nanikaMtdDirection
//
//進行方向取得メソッド
//
GetDirection nanikaVarDirection
EndFunc

BeginFunc nanikaMtdCall
//
//「何か」コールエントリ
//
call this main
EndFunc

BeginFunc main
//
//処理実行メソッド
//
Var TmpParameter
mov TmpParameter nanikaVarParameter
//↑ここまで

//以下にあなたが独自のスクリプトを書く。
//引き渡されたパラメーターは、この時点で変数 TmpParameter(int) に収まっている。
//実行する処理の分岐
if< TmpParameter 0 // -1以下だったら・・・
set VarFlag 1
abs VarParameter TmpParameter
call this subStop
else // 0以上だったら・・・
mov VarParameter TmpParameter
if< VarParameter 301 // 300以下だったら・・・
call this subSpeed
else // 301以上だったら・・・
set VarFlag 0
call this subStop
endif
endif

EndFunc
//以下は次回以降に追記
}

これまで同様、【何か】シリーズ・ベースキットの編成objectセクション(script WizObjTrain から } で閉じるまで)に追記する部分を黄色で示しています。なお、今回示しているのは、パラメーターの値に応じて実行する処理を切り替える部分だけです。実際の処理の中身は次回以降に解説します。つまり、上に示した部分だけを書いたスクロールを作っても動作はしません。その点、誤解のないように。

以下、内容を見ていきます。

まず“//↓独自の初期化処理(グローバル変数宣言等)はここで”の部分で、2つのグローバル変数VarParameterとVarFlagをVar命令で宣言しています。この理由は後述します。

次に、メソッドmainの中身を見ていきます。今回は、速度変更や駅停車の処理をおこなう部分は、スクリプトの読みやすさを優先して別のメソッドに分けることにしました。とりあえず、速度変更をおこなう部分をメソッドsubSpeed、駅停車をおこなう部分をメソッドsubStopと名付けることにします(中身は次回以降に)。

VRMスクリプトでは、異なるメソッドの間で数値をやり取りする場合、グローバル変数(メソッドの外側で宣言される変数)を使う必要があります。さきほど宣言したVarParameterとVarFlagがそうです。メソッドmainの仕事は、【何か】センサーから受け取ったパラメーターを解釈し、然るべき形に整えてグローバル変数VarParameterとVarFlagに収めてから、subSpeedかsubStopのどちらかのメソッドを実行する=callすることです。

これをメソッドmainの“//実行する処理の分岐”以降でおこなっています。最初に“if< TmpParameter 0”でパラメーターが-1以下の場合に対処しています。“set VarFlag 1”は、駅停車・再発車をおこなうメソッドsubStopで使う数値で、0ならばそのまま再発車、1であれば方向転換してから発車させます。具体的な記述は次回以降に紹介しますが、要するにTurn命令を実行するか否かをこの変数で決定する作戦です。続く“abs VarParameter TmpParameter”ですが、abs命令は「絶対値」を取り出す命令です。絶対値というのは、±符号を取り去った数値のことで、ここではパラメーターの頭についている「方向転換」を意味するマイナスを取り去って、「停車位置までの距離」に直す働きがあります。最後に“call this subStop”で駅停車・再発車を処理するメソッドを実行します。

“else”以降は、パラメーターが0以上の場合の対処になります。最初に“mov VarParameter TmpParameter”とあるのは、さきほどのabs命令に対応します。パラメーターが0以下の場合はマイナスを取る必要がありましたが、ここではパラメーターの値がプラスであることがわかっていますから、そのまま他メソッドと数値を共有するためのグローバル変数に代入しています。その上で“if< VarParameter 301”でパラメーターが300以下かどうかを調べ、以下であればメソッドsubSpeedを、超えている場合はメソッドsubStopをcallしています。後者については、方向転換しないことを意味する“set VarFlag 0”をおこなっている点に注意してください。

以上が、1つの【何か】スクロールに複数の機能を持たせる方法の概略になります。改めてまとめると、以下のような感じです。

・複数の機能はそれぞれメソッドしてまとめる(必須ではないが読みやすくなる)。
・それぞれの機能を担当するメソッドにパラメーターを引き渡すために、グローバル変数(上例ではVarParameter)を用意する。
・パラメーターの値の範囲によって、複数用意した機能メソッドのいずれかをcallするように、if命令で分岐させる。

次回は、機能メソッドの一方、subSpeedの中身を紹介していきます。

次回へつづく>
0

コメントを書く

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




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