今回は自車だけでなく、ライバル車も走らせます。このときに問題になるのがライバル車の動きです。今回は簡単にするためにコースの真ん中を走らせます(下の動画を参照)。

ライバル車を制御する

ライバル車がいる座標にもっとも近いコースの外側の座標と内側の座標を求めます。これを結んでできる線分の中点がコースの真ん中です。そしてこの線分に直角に交わる直線の方向ベクトルがライバル車が移動すべき方向です。

まずライバル車をつくります。ライバル車を登場させるからにはコースにあわせて方向転換させなければなりません。方向転換処理以外の部分を示します。

コンストラクタは自車を描画するための基底クラスと同じです。

Updateメソッドですが、自車の場合は方向キーを押すことで変化したCar.RotateやCar.SpeedからX方向とZ方向の速度を算出して位置を移動させればよかったのですが、ライバル車の場合は手動ではなく自動でなんらかの処理をさせなければなりません。そこでTurnAroundメソッドを新たに追加します。

Drawメソッドは方向転換をしているときは回転角を大きめに設定していましたが、ライバル車は通常の回転処理にします。実際に動かしてみるとかなりジグザグ運転をしてくれます。

方向転換の処理

次にTurnAroundメソッドですが、まずライバル車の現在位置からもっとも近い左右のブロック(コースとの境界)の座標を求めます。そしてこれに直交する方向がライバル車の向きです。ただし常にこの処理をおこなうと酷いジグザグ運転になるので、距離にして3以上外れたときだけ修正をおこないます。

またこの方法ではコースの中心からだんだん外れていきます。そこでライバル車の現在位置からもっとも近い左右のブロック同士の中点を理想の座標としてここからどれだけ外れているかを計算し、そこへ合わせます。

それからRivalCarクラスのなかでまとめて動かせるように以下も追加します。

実際に走らせてみる

あとはライバル車を追加して走らせるだけです。

更新と描画処理を示します。