ディフェンダーに似たオンライン対戦ゲームをつくる(1)の続きです。

今回はゲーム全体の処理をおこなうGameクラスを定義します。ここでやるのは各キャラクターの移動と更新、クライアントサイドで描画処理をするために必要なデータの取得などです。

以降は名前空間部分は省略します。

コンストラクタ

コンストラクタを示します。最初に必要な数のPlayer、Enemy、Sparkオブジェクトを生成しておき、以降はこれらを使い回します。

プレイヤーの追加と削除

InitPlayerメソッドはユーザーがプレイを開始したときに呼び出され、UninitPlayerメソッドはユーザーがページからの離脱したときに呼び出されます。「追加と削除」という表現をしていますが、リストに追加または削除されるわけではなくPlayerクラスのプロパティが変更されるだけで、オブジェクトの総数が変わるわけではありません。

GetPlayerCountメソッドは現在プレイしているユーザーの数を返します。

自機の操作

ユーザーが自機を操作(移動、加速、弾丸の発射)するための処理を示します。

PlayerSetVelocityXメソッドは自機を左右に移動させようとしたときに呼び出されます。”left”や”right”であれば左右に移動するための速度を与え、”none”なら停止させます。

PlayerAddVelocityYは自機を加速、減速させようとしたときに呼び出されます。”up”なら上方向へ加速、”down”なら下方向へ加速です。速度の絶対値が増加する場合はtrueを返します。

PlayerShotメソッドは弾丸を発射しようとしたときに呼び出されます。発射処理が行なわれたときはtrueを返します。

イベントの送信

敵機(他のプレイヤーを含む)を撃ち落とした場合や自機が死亡した場合はイベントを送信します。

イベントとイベントハンドラに渡す引数のクラスを示します。

敵を撃ち落としたときは100点を加算します。自機が死亡したときは残機1を減らして3秒後に自機を初期位置に戻して復活させます。残機が0の場合は復活することなくゲームオーバーイベントを送信します。

当たり判定

当たり判定の処理をおこないます。当たり判定はプレイヤーが発射した弾丸が敵に命中したか? 敵が発射した弾丸がプレイヤーに命中したか? プレイヤーと敵、プレイヤー同士が衝突したか?があります。

最初に爆発による火花を発生させる処理をおこなうExplodeメソッドを示します。

CheckBulletsHit1メソッドはプレイヤーが発射した弾丸が敵や他のプレイヤーに命中したかを調べます。キャラクターの中心座標を求めて、両者の距離の二乗とConst.CHARCTER_SIZEの半分の二乗を比較して命中したかどうかを判定しています。

CheckBulletsHit2メソッドは敵が発射した弾丸がプレイヤーに命中したかを調べます。キャラクターの中心座標を求めて、両者の距離の二乗とConst.CHARCTER_SIZEの半分の二乗を比較して命中したかどうかを判定しています。

CheckCrushメソッドはプレイヤーと敵、プレイヤー同士が衝突しているかどうかを判定します。

更新処理

プレイヤーと敵、火花をそれぞれ更新します。そのあと当たり判定をおこないます。非同期処理でforeach文を回すと例外が発生する場合があるので例外処理をおこなっています。

文字列の送信

描画処理をおこなうためにクライアントサイドに文字列を送信するのですが、その文字列を取得するための処理を示します。

各キャラクターの座標や状態をカンマ区切りの文字列に変換しています。