こんな感じのゲームをつくります。
下は本物のタンクバタリアンです。
「タンクバタリアン」(Tank Battalion)は、ナムコから1980年10月に発売されたアーケード用ビデオゲームです。黄色い戦車を動かして敵を倒していきます。自機タンクは画面上に一発の砲弾を発射でき、迷路状の壁は全て破壊できる。画面端から出現する青い敵タンクを一定数倒せば面クリアです。画面中央最下段に壁で囲まれた「司令部」があり、これに敵あるいは自機の弾が当たると自機の残数に関係なく即ゲームオーバーです。
せっかく3Dの戦車の撃ち合いゲームを作ったので3Dタイプのタンクバタリアンをつくりたいと思います。
前回作成したゲームでは複数の敵戦車が砲弾を撃ち込んでくるんでやられずに敵戦車を壊滅させるのは難しかったです。しかも自分の戦車からは前しか見えません。しかしタンクバタリアンはフィールド全体を見渡すことができます。敵はどこにいるのか? 砲弾は次期にむけて発射されているのかなどはわかります。
そこで3Dのタンクバタリアンもどきではレーダーのようなものをつけて自分の戦車と敵戦車の位置、発射された砲弾、障壁物、自分の司令部の状態がわかるようなものにしたいと思います。
それから前回のゲームでは敵は砲弾は斜めにも飛ばすことができ、しかも射撃は自分の戦車にむけて行なわれていました。これでは鬼ゲーすぎるので、タンクバタリアンに合わせます。敵味方いずれも戦車の向きは上下左右の方向しか向けられず、砲弾もその方向にしか飛びません。もし空中で砲弾同士が命中した場合はすれ違ってしまうのではなく、かならず衝突して双方は消滅する仕様にします。
これで少しはゲームとしてやりやすくなったと思われます。では早速コーディングしていきましょう。
自分の戦車と周囲を見えやすくさせます。ゲーム時は戦車の撮影は2.0後ろからおこないます。これなら周辺も見えやすいです。また壁を背にした場合、視点が壁のなかになり、なにも見えないという問題がおきるので、SetProjection()メソッドの視体積の設定を変えます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
// ゲームスタート時にカメラは戦車から2.0後ろから撮影する void ResetSight() { EyeX = 0f; EyeY = 1f; EyeZ = 2.0f; TargetX = 0f; TargetY = 1f; TargetZ = 0f; } private void SetProjection() { // ビューポートの設定 GL.Viewport(0, 0, glControl.Width, glControl.Height); // 視体積の設定 GL.MatrixMode(MatrixMode.Projection); Matrix4 proj = Matrix4.CreatePerspectiveFieldOfView( MathHelper.PiOver3, glControl.AspectRatio, 1.01f, // これより近いと見えない 30.0f // どこまで見えるか ); GL.LoadMatrix(ref proj); // MatrixMode を元に戻す GL.MatrixMode(MatrixMode.Modelview); } |
あとは以下のページと同じです。
それからタンクバタリアンにはフィールド上には障害物があり、砲弾を撃ち込むことで破壊することができます。そこでどの様なフィールドを作成するのか? どのような障害物を設置するのかも考えます。
フィールドは縦横13マスとします。