今回はミス時の処理を行ないます。ミスとは敵(地面も含む)に衝突してしまった、燃料切れで墜落してしまったなどが考えられます。自機や敵にはこれより内部に他のオブジェクトが存在する場合は衝突しているという矩形が設定されているので、これを使えば簡単にできそうです。

JikiクラスのDeadRectangleFメソッドは、自機の当たり判定をするために必要な矩形を取得するためのメソッドです。

StageクラスのIsDead()メソッドは自機が敵と衝突したかどうかを判定するためのメソッドです。

StageクラスのUpdate()内で自機が敵と接触したかどうかを調べます。そして敵に接触した場合は自機を消滅させます(爆発するような処理をさせたいがあとで考えます)。それと同時に自機死亡のイベントを発生させます。

Form1クラスで自機死亡のイベントを捕捉したらMiss()メソッドを呼び出します。Miss()メソッドでは残機を1減らし(0であるならゲームオーバー)、再出発地点に自機と視界を移動させます。

これは残機を表示させるためのメソッドです。

ではMiss()メソッドはどのように書けばいいのでしょうか?

まずタイマーを止めます。そして残機を1減らし、残機0ならゲームオーバー、そうでないときは一定時間経過後、ゲーム再開となります。再開するために別のタイマーを作成して3秒後にリスタートさせます。

ではRestart()メソッドはどのように書けばいいのでしょうか? スクランブルにはステージが存在し、ミスをするとステージの最初にもどってやり直しとなる仕様になっています。そのため最初のステージはクリアしたあと、第二ステージの途中でミスをした場合は第二ステージの最初からやり直すことになります。

いまは第一ステージしか作成していません(第二ステージではUFO、第三ステージではファイアボールが飛んでくるのですが・・・)。

いまは第一ステージしか存在しないので最初に戻ります。そのためRestart()メソッドの内容は以下のようなものになります。

また残機がゼロになった場合はゲームオーバーです。ここでは単純に「ゲームオーバー」と書かれたメッセージボックスを表示するだけにします。

ただこれではglControl1.Refresh()の前にGameOver()メソッドが先に呼び出されると自機が表示されたままになるので(実際に試してみるとそのようになる)glControl1.Refresh()を先に実行しておきます。