ミサイルコマンドのようなゲームをつくる 敵ミサイルの描画の続きです。

ミサイルを描画するためのMyMissileクラス

迎撃ミサイルを発射する処理を考えます。

迎撃ミサイルは点ではなく線で描画します。発射基地から直線が伸びていき目標点に到達すると爆発して敵ミサイルを撃墜します。

まずはミサイルを描画するためのクラスを作成します。

敵ミサイルと同じようにコンストラクタ内で発射位置と目標から移動方向と移動量を求めます。そのあとUpdateメソッドが呼び出されたら移動量だけ現在位置を変更します。このとき到達点と同じかこれを通過した場合は現在位置を目標と同じ座標にしてIsReachedプロパティをtrueにします。

爆発処理をするためのExplosionクラス

次に爆発処理をするためのExplosionクラスを作成します。

爆発によって光っている感じを出すために1フレームごとに色を変えます。同じ6種類のPenを作成してこれを使い回します。1フレームで半径が2ピクセルずつ広がります。Explosionオブジェクトの寿命は場合によって異なります。また爆発の輪が重なると不自然なので内部を背景色と同じ黒で塗りつぶします。

Form1クラスの処理

Form1クラスの処理を示します。

スペースキーが押されたら迎撃ミサイルを発射します。MyMissilesに新しいミサイルを追加します。ただし全都市が壊滅している場合はなにも起きません。

ミサイルを移動と敵ミサイルの撃墜ができたかどうかの判定処理を行ないます。

迎撃ミサイルを移動させる処理を示します。ミサイルが目標に到達しているのであればMyMissile.IsReached = trueになっているのでこのIsDeadプロパティをtrueにして爆発の処理をおこないます。

爆発の処理が行なわれている場合は敵ミサイルを撃墜できたかを調べます。爆発の円内に敵ミサイルが存在する場合は撃墜されたことになります。敵ミサイルも爆発し、この爆発によって他の敵ミサイルが誘爆することもあります。

爆発の処理をおこなうときは誘爆で最初の爆発が上書きされないように最後に追加するのではなく最初に挿入します。

描画の処理を示します。

ゲームとして完成させます。スコアの表示とゲームオーバー処理を追加します。

まずスコアを表示させます。敵ミサイルを撃墜したら25点追加します。

すべての都市が壊滅した場合はゲームオーバーです。ゲームオーバーの場合は「Game Over」「Press S key to try again」と表示させます。

ゲームオーバーの状態でSキーが押されたら新しくゲームを開始します。スコアをリセットして都市を復元し、ターゲットを画面の中心に設定してゲームを開始します。

描画処理を示します。