⇒ 動作確認はこちらから

アクセルとブレーキは別のキーにしてほしいというリクエストがあったので別バージョンも作成しました。Zキー:アクセル、Xキー:ブレーキです。⇒ 動作確認はこちらから

前回、問題点を解決しましたが、まだ未解決の問題として時間が正確でない問題があります。1秒間60フレームという前提ですが、実際には処理がおくれてしまうためそのようになっていません。そこでゲームの開始時刻と現在時刻の差から経過時刻を調べる方法で解決します。

経過時間を正確に測る

最初にUpdate関数が呼びだされたらそのときの時刻を記憶させます。そして再度Update関数が呼び出されたらそれとの差を調べます。これでゲーム開始からの時刻を知ることができます。またゲーム開始からの時刻から最後にゴールを通過した時刻を引けばラップタイムもわかります。

それからゴールしたかどうかの判定法も変えました。スタート地点に立ち止まったままでもゴールしたことにならないように、前回のゴールのときに変数 mileageAfterGoalをリセットして、mileageAfterGoalの値が一定以上でないとゴールしたとは判定されません。

ResetGame関数を示します。スタート時刻をリセットするとともに、自車とライバル車の状態をリセットします。

ライバル車の状態をリセットする

ライバル車の状態をリセットする処理を示します。RivalCarクラスにライバル車の状態をリセットするReset関数とAllReset関数を追加します。

ゲームらしくする

ゲームとして成り立たせるために残機制にしてクラッシュするたびに自機が減り、0になったらゲームオーバーとします。またラップタイムが1分を超えると残機1没収とします。

現在の状態を表示する

現在の状態を表示する関数を示します。

ゲームオーバー表示

ShowGameOverText関数はゲームオーバーのとき、ゲームオーバー表示をする関数です。

クラッシュ時の処理

クラッシュしたら自機を1減らします。

ゲームオーバーのときの処理

クラッシュすると自車が吹っ飛びますが、そのあと残機が0になっていた場合は復活させずにゲームオーバーの処理をおこないます。

ゲームオーバーの処理はフラグをセットするとともに自車を見えない位置に移動させます。

1分以内に1周できないなら1機没収

それから新しく作ったルールでは、ゴールしたときに1分以上かかっていた場合は1機没収することになっています。その結果、残機0になった場合はゲームオーバーです。

ゲームが終了したにもかかわらず時間が経過していくのはおかしいのでisGameOverがtrueのときはUpdate関数が呼び出されてもなにもしません。ただしこれまではUpdate関数のなかでUpdate関数を呼び出していました。これが途絶えてしまうとゲームを再開するときはもう一度Update関数を呼び出さなければなりません。

リトライ時の処理

ゲームをもう一度やるときの処理を示します。残機をゲーム開始時に戻してisGameOverフラグをクリアします。またisGameOverフラグがtrueだった場合、Update関数を呼び出します。

ゲームオーバーのときにSキーを押すとリトライできます。