クソゲーに魂を!プロジェクト(2)の続きです。今回はGameクラスを定義します。

インデントが深くなるので名前空間部分は省略して表記します。

またPositionクラスを定義します。

フィールド変数

以下のフィールド変数を定義します。

初期化

Gameオブジェクトを初期化する処理を示します。
フィールドの半径と終了までの残り時間を初期値に戻します。そしてPlayers、NPCs、AllPlayersに格納されているPlayerオブジェクトをクリアしてNPCを生成し直します。餌も生成しなおします。そのあとMatchBegunイベントを送信します(それぞれ詳細後述)。

NPCの初期化

NPCを初期化する処理を示します。まずNPCをどこに生成するかを決めなければなりません。この処理をおこなうのがGetPlayerInitPositionsメソッドです。フィールドの全体を 5 × 5 の区画にわけそれぞれの区画からランダムに座標を取得します。そのときにランダムに優先度も設定します。優先度でソートして最初のConstant.PLAYERS_INIT_COUNT個を取ることでNPCの初期座標を決定することができます。

取得されたNPCの初期座標から実際にPlayerオブジェクトを生成する処理を示します。NPCsリストをクリアして生成されたPlayerオブジェクトをNPCsリストとAllPlayersリストに追加しています。

SetIntelligenceToNPCsメソッドはNPCの知性(プレイヤーを攻撃するために適切に方向転換する頻度)を設定します。最大100、最低20と段階的に決めます。

餌の初期化

餌を初期化する処理を示します。とりあえず乱数で座標を求め、それがフィールドの内部(境界から40以上離れている)であればその位置に餌を生成するという処理を初期の餌の数になるまで繰り返しています。

MatchBegunイベント

MatchBegunイベントを以下の通り定義します。

Uninitialize

すべてのユーザーが離脱して接続数が0になったらUninitializeの処理をおこないます。

ユーザーが接続・離脱したときの処理

新規にユーザーが接続したときの処理を示します。このときはPlayerオブジェクトを生成してPlayersリストとAllPlayersリストに追加します。またASP.NET SignalRで使われる一意の接続IDからPlayerオブジェクトをすぐに取得できるようにConnectionIdPlayerPairs辞書にも登録します。

位置はフィールドの中央としますが、ゲーム開始ボタンを押すまでプレイヤーは描画されず当たり判定もないので死亡フラグをセットした状態にしておきます。

これはASP.NET SignalRで使われる一意の接続IDから対応するPlayerオブジェクトを取得するメソッドです。

ユーザーがゲーム開始ボタンを押したらプレイヤーの初期座標が決定しバトルに参加します。そのときの初期座標を取得する処理を示します。

長々と書いていますが、できるだけ他のプレイヤーがいない区画を探してそこに出現させようとしています。

ユーザーが離脱したときの処理を示します。このときは対応するPlayerオブジェクトをPlayersリストとAllPlayersリストから削除します。またConnectionIdPlayerPairs辞書からも削除します。

なんらかの原因でゲームから離脱するつもりはないのに通信が切れてしまう場合があります。この場合、再接続の処理に成功したときASP.NET SignalRで使われる一意の接続IDが別のものになってしまいます。

以下の処理はASP.NET SignalRで使われる一意の接続IDが変更されたときに以前と同じPlayerオブジェクトを取得できるようにするためのものです。

新しいステージの開始

このゲームは複数のプレイヤーとNPCが同一フィールド内でバトルして勝者が決まったら次のバトルステージに移行してバトルを繰り替えすゲームです。新しいステージを開始するときの処理を示します。