ASP.NET Core版 対人対戦できるぷよぷよをつくる(1)の続きです。

PuyoMatchHubクラスの定義

AspNetCore.SignalR.Hubクラスを継承してPuyoMatchHubクラスを定義します。名前空間は省略して書きます。

接続時の処理

静的変数と定数部分を示します。

AspNetCore.SignalRのConnectionId(一意の接続ID)をキーにしてIClientProxyとプレイヤー情報が格納されたPlayerInfoオブジェクトを登録する静的変数を定義しています。また現在対戦されているゲームの処理をするためのPuyoMatchGameオブジェクトのリストも定義します。

接続されたときの処理を示します。

更新時の処理

Timer.Elapsedイベントが発生したらPuyoMatchGameクラスの各プロパティから文字列を取得してクライアントサイドに送信します。またゲームをしているユーザーであってもそうでなくても”SendToClient”を送信して通信が切れるのを防ぎます。

登録時の処理

ユーザーはページにアクセスして[エントリー]ボタンを押すと自分自身をプレイヤーとして登録できます。そのための処理を示します。

もしそのときにすでに登録している人がいたらその人との対戦がはじまります。誰もいない場合は辞書WaitingPlayersに登録され、他のプレイヤーがくるのを待ちます。

CheckGameAbandonedメソッドはマッチング成立からゲーム開始までに試合放棄があるかもしれないので、これをチェックします。試合放棄があった場合は放棄しなかった側が勝者です。

イベントハンドラの追加とその定義

PuyoMatchGameオブジェクトの初期化でイベントハンドラを追加する処理を示します。

PuyoMatchGameクラスでイベント発生時はクライアントサイドにデータを送信しますが、そのときにどこへ送信するかが問題になります。対戦している両者のIClientProxyを取得する処理を示します。

イベントハンドラの定義部分を示します。

ゲームオーバー時のイベントハンドラを示します。

ここではゲーム開始時に追加されたイベントハンドラ(+PuyoMatchGameクラス内で追加されたイベントハンドラ)をRemoveしてGamesから該当するインスタンスを取り除きます。

ゲーム開始時に追加されたイベントハンドラをRemoveする処理を示します。

キー操作に対応する処理

キー操作されたときには該当するPuyoMatchGameオブジェクトを探して、内部のフラグをセットまたはクリアします。

Ping値を表示させるための処理

動作が重いときがあるのでPing値を表示させてはどうかというリクエストがあったので、クライアント側から飛ばしたPingを受け取るメソッドを定義します(中身は空っぽでOK)。

自分自身のPing値だけでなく対戦している相手のPing値も表示させたいので、クライアントサイドでPing値を計測できたら、再度これをサーバーサイドに送り返させて両者に送信します。PingResultToServerメソッドは受け取ったPing値をgame.Pings[n]にセットします。

通信が切断時の処理

通信が切断されたときの処理を示します。

ClientProxyMapからキーを削除します。また対戦中なのに通信を切断したり、プレイヤーとして登録しているユーザーが通信を切断する場合があるかもしれません。その場合はGamesリストまたはWaitingPlayers辞書から該当するものを取り除きます。対戦中なのに通信を切断するのは試合放棄になります。この場合は相手にそれを通知するための処理をおこないます。