ASP.NET Core版 対コンピュータ対戦できるぷよぷよをつくる(2)の続きです。今回はAspNetCore.SignalRにおける処理を実装します。

PuyoHubクラスの定義

以降は名前空間を省略して以下のように書きます。

静的なメンバーとして以下を宣言します。

接続されたときの処理

クライアントサイドからAspNetCore.SignalRで接続したときはContext.ConnectionIdをキーにしてClients.Callerを辞書に登録します。そしてPuyoGameオブジェクトを生成してこれもContext.ConnectionIdをキーにして辞書に登録します。これらは切断時に辞書から削除されます。これらの処理が滞りなく完了したときは”SuccessfulConnectionToClient”をクライアントサイドに送信して処理が正常に行なわれたことを通知します。

また初回実行時はタイマーの初期化をおこないます。PuyoGameオブジェクトの状態を取得してこれを1000 / 30ミリ秒ごとにクライアントサイドに送信します。

サーバーへの負荷を考慮して誰も接続していない場合はタイマーを停止させます。この処理によってClientProxyMap.Countが1になったときはタイマーが停止している状態なのでStartさせます。

切断時の処理

切断されたときは辞書からContext.ConnectionIdをキーにするものを取り除きます。そしてこの処理によってClientProxyMap.Countが0になったときは誰もゲームをしていないということなのでタイマーを停止させます。

ゲームスタート時の処理

ユーザーがゲームを開始したときはGameStartメソッドが呼び出されるので、このときに対応するPuyoGameオブジェクトを探してPuyoGame.GameStartメソッドを実行します。またゲーム開始の処理が正常におこなわれたことを伝えるために”EventGameStartToClient”をクライアントサイドに送信します。

キー操作時の処理

ユーザーがキー操作をしたときはそれに対応してPuyoGameクラスから適切なメソッドを呼び出します。

イベント時に対応させる

PuyoGameクラスでイベント発生時にはクライアントサイドにこれを伝えます。GetClientメソッドは引数からこれに対応するIClientProxyを取得するためのものです。

回転が成功したときはクライアントサイドに”RotatedToClient”を、組ぷよを急速落下させたときは”DownedToClient”を送信します。

次の組ぷよが出現したときはクライアントサイドで次回と次々回に落ちてくる組ぷよの表示を変えないといけないので、クライアントサイドに”SendNextToClient”を送信します。

連鎖発生時は効果音を鳴らしたい(プレイヤーとCPUでは音も変えたい)ので”PlayerRensaToClient”と”CpuRensaToClient”を送信します。

おじゃまぷよが落ちてくるときも効果音を鳴らしたい(プレイヤー側とCPU側、大量落下時などで音を変えたい)ので、クライアントサイドに”OjamaFalledToClient”を送信します。また相殺発生時には”OffsetToClient”を送信します。

ステージクリア時とゲームオーバー時もクライアントサイドに”StageClearedToClient”または”GameOveredToClient”を送信します。

更新処理

Timer.Elapsedイベントが発生したら辞書内に存在するすべてのPuyoGameからその状態を取得して、これをそれらに対応するクライアントに送信します。送信するデータはプレイヤーとCPU側双方のフィールド上に固定されたぷよの位置と種類、落下中の組ぷよやおじゃまぷよ、スコアです。