3Dっぽい縦シューティングゲームをつくる (その1)

前回は3Dっぽい縦シューティングゲームの基本的な部分をつくりました。今回は自機を描画して弾丸を発射させるところまでやります。

メニューの[スタート]をクリックしたらゲームスタートです。視点をプログラム開始の位置に戻して新しく自機が生成されます。

では自機を表示するためのクラスとはどのようなものなのでしょうか?

まず画像としてこれをつかいます。

ここから自機として使える部分を切り取って使います。

クラスは自機だけでなく敵や弾丸などのクラスもあります。共通しているのは移動したり描画される部分です。そこでこれらの基底クラスを作成して、これを継承して自機クラスを作成します。

基底クラスにするCharacterクラスは位置情報やXY方向に移動する量、描画処理などをおこないます。各キャラクターのコンストラクタ内でテクスチャを作成し、これをつかって描画をおこないます。テクスチャ作成に必要なBitmapは上記の画像の適切な部分を取り出して使います。

では次に自機クラスを作成します。

Move()メソッドのなかで移動量をXY座標にプラスしています。ただし画面の外に出てしまわないように一定数を超える場合はそれ以上の値にならないようにしています。また描画時は左右に移動しているあいだは機体が傾いて描画されるようにしています。

それからIsMutekiというプロパティがありますが、これは敵弾に当たったときに立て続けにやられるのを防ぐためのものです。敵弾に当たった場合は1秒間IsMutekiプロパティがtrueになり、自機は点滅表示となり、そのあいだは当たり判定は行なわれません。また通常であれば背景は黒ですが、自機がダメージをうけたときは背景を赤に変えます。

基底クラスのMove()メソッドで何回Move()メソッドが実行されたかカウントしています。この値を利用して必要な処理をおこなえるようにしているのですが、自機クラスではフィールド変数X、Yに代入できる値を変更するため、基底クラスのMove()メソッドは呼び出さずに自分でMoveCountをインクリメントしています。

ではForm1クラスに処理を追加して実際に表示されるようにしてみましょう。

自機を操縦する機能も追加します。方向キーが押されている間は自機に移動量を設定します。離されたらその方向の移動量をゼロにします。ただし縦方向の移動は視点がつねにY軸方向に移動しているので、なにもないときはForm1.Speed(=0.2f)とし、↑が押されているときはさらに0.1f追加、↓が押されているときは0.1f減速しています。

次に弾丸を発射する処理をおこないます。

以下は自機から放たれた弾丸を管理するクラスです。弾丸の移動(XY座標の変更)は基底クラスのMove()メソッドでおこないます。ここには書きません。

では自機から弾丸を発射する機能を追加してみましょう。スペースキーはおされるとJikiShot()メソッドが実行されます。弾丸はシューティングゲームらしく3方向に飛ぶようにします。Update()メソッドのなかでMoveJikiBurrets()メソッドを呼び出して弾丸を移動させます。

弾丸は敵に命中した場合は消滅します。それだけでなく一定の距離(見えなくなる距離)を飛ぶと描画の処理は不要なのでリストのなかから取り除きます。IsOutOfField(Character character)メソッドは各キャラクターが描画不要の位置に存在するかどうかを判定するメソッドです。

弾丸の描画はglControlEx1_Paint(object sender, PaintEventArgs e)内でDrawJikiBurrets()メソッドを呼び出しておこないます。