ボスコニアンのようなオンライン対戦ゲームをつくる(2)の続きです。今回はゲーム全体を管理するGameクラスを定義します。

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

Gameクラスの定義を定義します。

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

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

Player、Enemy、Fortress、Sparkオブジェクトを生成してリストに格納します。そして以降はこのオブジェクトを使い回します。

プロパティではありませんが、以下はプレイに参加していないPlayerオブジェクトを取得するメソッドです。

更新処理

更新処理時の処理を示します。プレイヤーと敵、要塞の更新処理をしたあと当たり判定をおこないます。最後に火花の更新処理をおこないます。

プレイヤーの更新処理

プレイヤーを更新する処理を示します。

プレイヤーと弾丸を移動させます。そのあとどのプレイヤーからも見えない弾丸を消去する処理をおこないます。if文のなかで32を足しているのはコメントにあるとおりで、敵から逃げながら弾丸を発射すると命中扱いにならないことが多くなるので、それを避けるためです。

敵の更新処理

敵の更新処理を示します。

敵と敵の弾丸を移動させます。また48更新に1回の割合で敵に弾丸を発射させます(ただし生成されたばかりの敵は弾丸を発射しない)。弾丸を発射するときは射程距離内(canvasのサイズの半分の距離以内)にプレイヤーが存在するときにほぼプレイヤーがいる方向にむけておこないます。

要塞の更新処理

敵の要塞の更新処理を示します。

砲台から発射された弾丸を移動させます。更新回数を30で割ったときの剰余が砲台の番号×5のときは弾丸を発射させます(ただし生成されたばかりの要塞は弾丸を発射しない)。弾丸を発射するときは射程距離内(canvasのサイズの半分の距離以内)にプレイヤーが存在するときにほぼプレイヤーがいる方向にむけておこないます。

当たり判定

更新処理のあとは当たり判定をおこないます。

プレイヤーの弾丸は敵に命中したか?

プレイヤーの弾丸は敵に命中したかどうかを判定する処理と命中時の処理を示します。

弾丸に死亡フラグがセットされている場合や敵が生成されたばかりの場合は当たり判定は「なし」と判定します。命中したときはプレイヤーに点数を加算して爆発を発生させます。撃墜された敵はすぐにランダムな位置で復活させます。

弾丸が敵に命中したかどうかを返すメソッドを示します。

イベントの引数に使われているMyEventArgsクラスの定義を示します。

プレイヤーの弾丸は要塞に命中したか?

プレイヤーの弾丸は要塞に命中したかを判定する処理と命中時の処理を示します。

まず弾丸が砲台に命中しているか調べます。砲台に命中した場合は敵に命中したとき同様、点数を加算して爆発を発生させます。砲台が破壊されることで要塞の砲台がすべて破壊された場合は要塞全体を大爆発させます。破壊された要塞はすぐに別の位置で復活させます。

砲台ではない場所に命中した場合はそれが要塞の中心部かそうでないかで処理をわけます。要塞の中心部に向けて上下にまっすぐ弾丸が移動している場合は弾丸はそのまま進行させます。そして弾丸が中心部に到達したら要塞全体を爆発させます。このときはザコ敵を倒したときよりも大幅に大きな点数とします。要塞の内部で中心部に到達することがない部分や弾丸の進行方向が上または下ではない場合は弾丸の死亡フラグをセットして消滅させます。

弾丸はプレイヤーに命中したか?

敵や要塞の砲台、他のプレイヤーが発射した弾丸がプレイヤーに命中したかを判定する処理と命中時の処理を示します。

命中時は機体を中心に爆発を発生させます。またOnPlayerDeadメソッドを呼び出して自機死亡のイベントを送信します。残機0の場合はゲームオーバーのイベントも送信します。

他のプレイヤーが発射した弾丸がプレイヤーに命中したかを判定するときは、自分が発射した弾丸が自分に命中したときは除外するようにします。

プレイヤー同士の衝突判定

プレイヤー同士の衝突を判定する処理を示します。この場合は当然ながらどちらも死亡として処理します。

プレイヤーと敵の衝突判定

プレイヤーと敵の衝突を判定する処理を示します。この場合はプレイヤーも敵も死亡として処理します。点数の加算はありません。

プレイヤーと要塞の衝突判定

プレイヤーと要塞の衝突を判定する処理を示します。原作ではプレイヤーだけでなく要塞も大爆発して点数もある程度加算されるのですが、このゲームでは要塞はそのまま残ることにします。要するにプレイヤーの犬死にです。