今回はボスコニアンに似たオンライン対戦ゲームをつくります。

『ボスコニアン』(BOSCONIAN)は、1981年11月にナムコから稼働されたアーケード用多方向スクロールシューティングゲームです。全方向任意スクロールの2Dシューティングゲームとなっており、3038年を舞台に自機「スペースパトロール機」を操作して「宇宙海賊ボスコニアン」の基地を破壊する事を目的としています。

単純に敵を倒すだけでなく複数のプレイヤー同士で互いを攻撃することができる仕様にしています。

ちなみに元々の『ボスコニアン』(BOSCONIAN)はこのようなゲームです。

ではさっそくつくっていきましょう。名前空間はBosconianとします。

Constクラスの定義

定数に関する定義をします。

Bulletクラスの定義

弾丸を移動させたり描画するためにBulletクラスを定義します。

以降は名前空間の部分は省略して書きます。

コンストラクタとプロパティ

コンストラクタと各プロパティを示します。

発射時の処理

弾丸が発射されたらInitメソッドを呼び出し、初期座標と速度を設定します。発射以降は弾丸は存在するので死亡フラグはfalseにします。

移動処理

弾丸を移動させる処理を示します。速度だけ座標を変更するのですが、フィールドの端に来たら反対側に移動させます。

Sparkクラスの定義

爆発によって発生する火花を移動させたり描画するためにSparkクラスを定義します。

以降は名前空間の部分は省略して書きます。

コンストラクタとプロパティ

コンストラクタと各プロパティを示します。Bulletクラスと似ていますが、火花は発生から時間の経過とともに描画に使うイメージが変化します。2回更新すると別のものに変化します。そして6回変化(12回更新)したら消滅することにします。

爆発が発生時の処理

爆発が発生したらInitメソッドを呼び出し、初期座標と速度を設定します。火花が消滅するまでは火花は存在するので死亡フラグはfalseにします。また何回更新したか数えられるようにフィールド変数を0で初期化します。

火花の更新

火花の状態を更新する処理を示します。速度だけ座標を変更するのですが、フィールドの端に来たら反対側に移動させます。また2回更新されたらTypeを1増加させ6になったら死亡フラグをセットして消滅させます。

Playerクラスの定義

プレイヤーの機体を移動させたり描画するためにPlayerクラスを定義します。

以降は名前空間の部分は省略して書きます。

コンストラクタとプロパティ

コンストラクタと各プロパティを示します。

コンストラクタのなかでプレイヤーが発射できる最大数より少し多い数のBulletオブジェクトを生成しておきます。そしてこれらを使い回します(サーバーサイドの処理でオブジェクトを次から次へと大量生成するのはよくないらしい)。

プレイ開始時の処理

プレイヤーがゲームに参加したときに行なわれる処理を示します。

死亡フラグをクリアして各プロパティを初期化します。引数のプレイヤー名とASP.NET SignalR の接続IDをセットしたあと、乱数を生成してフィールド上にランダムに配置します(復活時の狙い撃ちを避けるため)。初期の移動方向は上です。残機をREST_MAXに設定して5秒間は無敵状態とし、描画処理では点滅表示させます。無敵状態のときは当たり判定をおこないません。

プレイヤー死亡時の処理

プレイヤー死亡時の処理を示します。

死亡フラグをセットして残機を1減らします。それでも残機がある場合は2秒後に死亡フラグをクリアしてフィールド上にランダムに配置します。そして3秒間は無敵状態とします。残機0になった場合はゲームオーバーです。ConnectionIdプロパティを空文字列にします。これによってプレイヤーは自機を操作できなくなります。

プレイヤーの移動処理

プレイヤーを移動させる処理を示します。

すでに発射された弾丸を移動させます。もし死亡フラグがセットさせていたらそれ以外にすることはありません。自機が生きている場合は移動速度分だけ座標を変更します。このときフィールドの端を超えたら反対側にワープさせるのは弾丸の処理と同じです。

移動方向変更時の処理

ユーザーのキー操作で自機の移動方向を変更する処理を示します。押されたキーで機体の方向が決まるので、三角関数で自機のXY方向の移動速度を求めてセットしています。回転時は現在の機体方向を取得して45度左右に回転させています。このときdouble型だとcos(π/2)がちょうど0にならないので絶対値を調べて1未満の場合は強制的に0を設定しています。

弾丸発射時の処理

弾丸を発射する処理を示します。

無制限に連射できるとゲーム的におもしろくないので制限をかけています。IsDeadフラグがセットされているBulletオブジェクトを探して2つ以上見つかったときは自機の位置を初期座標、自機の進行方向から弾丸の初速を算出してセットしています。このときプレイヤーからみて弾丸が前後に同じスピードで飛んでいるように見えるようにしたいので、機体の速度に求めた計算結果をプラスマイナスしたものが弾丸の発射速度になります。