今回は目覚まし時計を線路プレートの上で移動させます。

動作確認は こちらから

移動させるときの考え方はC# WinndowsFormsで作成したチクタクバンバンのようなゲームをつくるとほとんど同じです。

まず目覚まし時計がどのプレートの上にいるかを記憶しておきます。そしてプレートから別のプレートまで移動する時間を決めておけば目覚まし時計がどのプレートのどの位置にいるかを特定することができます。

最初に目覚まし時計がプレート上をどこからどこへ移動するかを表す列挙体を定義します。

DirectOfMove列挙体

AlarmClockクラス

次にAlarmClockクラスを作成します。まずプロパティとコンストラクタを示します。

初期化

コンストラクタの第一引数は時計を表示させるでCOLLADA ファイル (.dae)から読み取って生成されたものです。第二引数は最初はどのプレートの上にあるかを示すもので、ここから初期状態における移動方向を求めます。

目覚まし時計を移動させる処理

目覚まし時計を移動させる関数を示します。目覚まし時計がどの方向に進行しようとしているかを調べて適切な関数を呼びます。

まっすぐに移動させる

これは目覚まし時計が西から東に移動するときの処理です。目覚まし時計がプレート内に入ってから移動した回数とプレートが存在する座標から目覚まし時計の位置を求めています。また進行方向に目覚まし時計の正面が向くようにrotation.zの値を調整しています。西から東とか北から南とまっすぐ進行する場合はそれほど難しくありません。

東から西、北から南、南から北の処理も同様に行ないます。

カーブを描いて移動させる

次にプレートの上でカーブする移動の場合を考えます。これは北から東に移動するときの処理です。三角関数を使えばうまくできます。

同様に他の方向へ移動する場合の処理も示します。

別のプレートに移動する処理

次に現在のプレートから別のプレートに移動する処理を考えます。まず進行方向からみて隣にあるプレートが存在するかどうかを調べます。存在する場合、移動可能なプレートかを調べます。移動可能であれば新しくAlarmClock.TrackPlateにそのプレートをセットし、どの方向に移動するかをAlarmClock.DirectOfMoveにセットします。

次のプレートが存在しない場合、存在するが移動可能でない場合はゲームオーバーです。このゲームは残機制ではなく一発ゲームオーバーとします。

これは北からプレートの外に出たときの処理をする関数です。

同様に南、東、西から外へ出た場合についても示します。

ゲームオーバー時の処理

ゲームオーバーになったときの処理を示します。AlarmClock.DirectOfMoveにDirectOfMove.Noneをセットします。これでMove関数が実行されても目覚まし時計は動かなくなります。

動作確認は こちらから