今回でOpenTKでつくる3Dカーレースゲームを完成させます。完成したゲームの動画。

前回のプログラムではライバル車を登場させましたが、ライバル車との当たり判定は考えていませんでした。そのため衝突しても内部をすり抜けてしまうという現象がおきました。今回はライバル車との当たり判定もおこないます。

下は前回の動画

今回はライバル車との当たり判定と衝突時の処理も実装しました。

ライバル車との当たり判定

まずRivalCarクラスに以下のメソッドを追加します。

これは自車と衝突したRivalCarを返すメソッドです。

ライバル車同士の当たり判定

これは各ライバル車が自車を含む別の車と衝突したときにそのCarを返すメソッドです。

ライバル車がクラッシュしたときの処理

自車が衝突した場合は派手に吹っ飛んでもらいますが、ライバル車の場合はその場でスピンさせます。このときY座標を少し浮かせます。これによってライバル車の状態が通常走行をしているのか、クラッシュしてスピンしているのかがかわります。

ライバル車の更新処理を示します。

CheckCrashメソッドがnullを返し、Y座標も0である場合は通常走行をしている状態です。この場合はこれまでどおりの処理をおこないます。クラッシュしてスピンするということはライバル車のスピードは0になるので通常移動できたときの自車の速度を記憶しておきます。

CheckCrashメソッドがnullを返さなかった場合はクラッシュした場合です。この場合、車体を少し浮かせます。Y座標が0でない場合はスピンしている状態です。

この方法ではライバル車同士が接触した場合、スピンするのは片方だけです。ちょっと理不尽かもしれませんが、処理を簡単にするためにこのような仕様にします。自車と接触した場合は両方とも処理をします。自車はふっとび、ライバル車はその場でスピンします。そしてライバル車は自車が復帰する前にその場から立ち去ります。

次に自車の処理を考えます。といってもUpdateCarStatusNomalメソッドの最初のif文の条件式が変わっただけです。

現実に近い速度を表示させる

ところでコースは筑波サーキットをモデルにしています。

筑波サーキット | わかりやすい モータースポーツ競技規則

「コース全長が約2kmと短いため、本格的なレース開催には適していませんが、首都圏から近いサーキットであるため、アマチュアレースや数多くの走行会を開催しています」とのこと。

これまで速度表示をしてきましたが適当な値でした。そこで実物に近づけるため、以下のような変更を加えてみました。

これで一周回ったときのMileageの値は2400前後でした。筑波サーキットはコース全長が約2kmなので以下のように変更します。

以下のコードで1フレームあたりの筑波サーキットにおける移動量と時速を算出できます。

あとはGameManagerクラスのUpdateメソッドを変更して

タイムトライアル的なゲームにする

制限時間を設けてどれだけ走れるか、残機制にして総走行距離を競うゲームにしてみると面白いかもしれません。以下は短い時間で一周する時間を競うゲームにした例です。

GameManagerクラスに以下の修正を加えます。

ゴールしたかどうかはスタート地点の脇にあるブロックが再び自車からみて最短距離にきたかどうかで判断しています。スタート時もスタート地点の脇にあるブロックが自車からみて最短距離にあります。そこである程度
走行してからでないとゴールとは見なさない、逆走をしてゴールラインにきてもゴールとは見なさない仕様にしています。

実際に操作した動画です。筑波サーキットにおけるコースレコードは43秒304とのことですが、どうしても50秒以上かかってしまいます・・・。