前回作成したプログラムではコースアウトをしてもなにも起きませんでした。今回はクラッシュしたときの処理を考えます。クラッシュすると下の動画のようになります。

コースアウトの判定

まずコースアウトしたかどうかの判定ですが、車のX、Z座標がコース内から外(境界線も含む)になったときにそのように判定します。

クラッシュの演出をどのようにするかですが、車を不規則に回転させながら吹っ飛ばすことにします。すると更新処理をするUpdateメソッドだけでなく、カメラの座標も変えるSetSightメソッドも考えなければなりません。というのは前回のプログラムではカメラは車の真後ろを付いてくるだけでした。これを変えないといけません。

車の状態を示す列挙体

最初に車の状態を示す列挙体をつくります。車の状態として考えられるのは

通常走行
クラッシュしたとき

です。ほかにもゴールしたときも考えないといけないかもしれませんが、これはそのときに考えます。

クラッシュ時の車の動きを変える

次にUpdateメソッドを変更します。

通常時とクラッシュ時で車の動きがかわるのでUpdateメソッドを変更します。CarStatusによってUpdateCarStatusNomalメソッドとUpdateCarStatusCrashメソッドを使い分けます。

通常時の更新処理をするUpdateCarStatusNomalメソッドを示します。クラッシュすることなく移動した場合はその座標を記憶しておきます。クラッシュから回復するときに車を配置する座標を計算するときに必要だからです。クラッシュしたらクラッシュした座標も記憶させます。

これはCarクラスにおける描画処理です。クラッシュした車は不規則に回転しながら画面外に飛んでいくので描画処理をGameManager.CarStatusの状態で変える必要があります。またつねに車の方向が同じなのは不自然なのでハンドルを切っているときは方向転換しているかのように車体の向きを変えて描画させます。

クラッシュから回復する

クラッシュしたときの更新処理を示します。車は衝突したときの速度と反対方向に飛ばされます。2秒間この処理を繰り返したらゲームを続けられるように車をもとの状態に戻します。

そのために直前に正常移動できていた車の座標からもっとも近くにあるコースの境界線上の点を求めます。コースの境界線は内側と外側があります。それぞれのクラッシュ前の車の座標にもっとも近い2点の中点が車の復活場所です。また車の方向も2点の座標から三角関数をつかって求めています。

車の状態でカメラの座標を変える

更新処理だけでなくカメラの座標もCarStatusで変えなければなりません。通常時はMyCarを真後ろから追いかけてきましたが、クラッシュ時はクラッシュした場所にとどまらなければなりません。