ミサイルコマンド (Missile Command) は、1980年にアタリが発売したアーケードゲームです。上空から落下してくる弾道弾ミサイルから都市を守るために迎撃ミサイルで迎撃する内容になっています。

画面下部の両端と中央に3つの自軍砲台基地があり、その間には都市が計6つあります。迎撃ミサイルは砲台基地毎に発射数が決まっていて、3つボタンで迎撃ミサイルの発射を操作します。ただし今回は砲台基地はひとつだけ発射数の制限なしということで進めます。

都市を描画する

守るべき都市は6つです。Bitmapは同じものを使うので静的変数にしてあります。GetBitmapメソッドで元になる画像ファイルからBitmapを取得しています。

元になる画像ファイルはこれを使います。

コンストラクタで指定されたサイズに変更してから青の部分だけを描画します。CenterXプロパティとCenterYプロパティは都市が描画される矩形の中心の座標です。敵のミサイルはここをめがけて進みます。敵のミサイルが着弾したらIsDeadプロパティがtrueになります。敵弾が都市に到達したかどうかはIsInsidePointメソッドで判定します。

次にForm1クラスを考えます。方向キーをおすとターゲットがその方向に移動し、スペースキーを押すとミサイルがそこへむけて飛んでいき、ターゲットに到達すると爆発して敵のミサイルを撃墜します。

コンストラクタ内でタイマーを初期化して1秒間に60回再描画させます。

そのあと都市を描画する準備をします。等間隔で6個分の都市を描画できるような矩形を求めます。

また迎撃ミサイルを発射するときのターゲットを+印で表示します。最初の座標は画面の中央です。LauncherStartPointは迎撃ミサイルが発射される場所の座標です。実際のミサイルコマンドでは3箇所から弾数に制限がありますが、ここでは弾数制限なし、中央下部から発射される仕様にします。

TargetXとTargetYはターゲットの座標を示すプロパティです。値を設定する前に画面の外側にでないようにしています。

キーを押すとターゲットが移動します。キーを押すとどの方向に移動するかがセットされます。この状態でInvalidateメソッドが呼び出されるとその方向にターゲットが移動します。

ターゲットを移動させて描画する処理を示します。Timer.Tickイベントが発生したらInvalidateメソッドを呼び出し、OnPaintメソッドのなかで移動先の座標にターゲットを描画するとともに都市を描画します。

敵のミサイルを描画する

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

コンストラクタのなかで敵ミサイルが出現する座標とミサイルがどの都市に向かって落下するかを設定します。また落下速度も指定できるようにします。

コンストラクタのなかで敵ミサイルが出現する座標とどこへ向かって落下するかで移動方向と移動量を算出します。ミサイルは赤い線で描画され、撃墜されると消えます。

Form1クラスでTimer_Tickメソッドが呼び出されるとUpdateメソッドが呼び出されます。Updateメソッドのなかで現在座標がコンストラクタ内で算出された移動量だけ変化します。そのあとDrawメソッドで描画させます。

Form1クラスでは敵ミサイルの移動と生成をおこないます。Timer_Tickが何回呼び出されたかをあとで使用するので保存しておきます。

敵ミサイルを生成する処理を示します。ミサイルが生成される座標はY座標は0、X座標は乱数で求めます。また新しいミサイルを生成するタイミングで落下中のミサイルのどれかを分岐させます。

TickCountが増えるとそれだけミサイルが生成される間隔が短くなり、落下速度もアップします。

敵のミサイルを落下させる処理を示します。もし都市が全滅している場合は早く終わらせるためにミサイルの落下速度を速くします。

CheckEnemyMissileLandingメソッドは敵ミサイルが都市に到達しているか貫通しているかどうかを調べます。そして該当するミサイルと都市が存在する場合はミサイルを爆発させて都市を消滅させます。

描画の処理を示します。

続き:迎撃ミサイルを発射する ミサイルコマンドのようなゲームをつくる(2)