ディフェンダーに似たオンライン対戦ゲームをつくる(2)の続きです。今回はクライアントとサーバー間およびサーバーからクライアント間の通信を可能にするためのHubクラスを定義します。

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

サーバーに接続時の処理

ユーザーがサーバーに接続したときに呼び出される処理を示します。

辞書にContext.ConnectionIdを追加し、クライアントサイドに接続に成功した旨を通知します。また初回のみタイマーの初期化とGameオブジェクトにイベントハンドラを追加する処理をおこないます。またタイマーが停止している場合はスタートさせます。

通信切断時の処理

接続が切断されたときに呼び出される処理を示します。

辞書からContext.ConnectionIdを削除し、プレイ中の場合は対応するPlayerオブジェクトのプロパティを変更しなければならないのでGame.UninitPlayerメソッドを呼び出します。接続数が0になったらタイマーを停止させます。

ゲーム開始時の処理

ゲーム開始時の処理を示します。クライアントサイドからプレイヤー名が送られてくるので、これをPlayerオブジェクトのプロパティにセットするためにGame.InitPlayerメソッドを呼び出します。処理が成功した場合は”SendToClientGameStartSuccessful”を、失敗した場合は”SendToClientGameStartFailure”をクライアントサイドに送信します。

自機操作時の処理

ユーザーが自機を操作しようとしたときにおこなわれる処理を示します。左右に移動しようとしたときはSetVelocityXメソッドが、加速減速をしようとしたときはAddVelocityYメソッドが、弾丸を発射しようとしたときはShotメソッドが呼び出されます。速度の絶対値が増加した場合はクライアントサイドに”SendToClientSpeedUp”を、弾丸発射の処理が行なわれたときは”SendToClientShot”をクライアントサイドに送信します(効果音を鳴らしたい)。

更新処理

更新とクライアントサイドに描画処理用のデータを送信する処理を示します。

Game.TryUpdateメソッドを実行したあと、Game.TryGetSendDataメソッドで取得した文字列をクライアントサイドに送信します。

イベントの送信

クライアントサイドに敵を撃ち落としたとき、敵に撃ち落とされたとき、ゲームオーバーになったときにイベントを送信する処理を示します(効果音を鳴らしたい)。