ASP.NET Core版 タイピングゲームをつくる(1)の続きです。今回はAspNetCore.SignalRにおける処理を実装します。

TypingHubクラスの定義

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

接続時の処理

最初に接続時の処理を示します。辞書にContext.ConnectionId, Clients.CallerとTypingGameのインスタンスを登録します。これはこれまでやってきたASP.NET Core版アプリと同じです。

TypingGameのインスタンスを生成したらイベント発生時に対する処理ができるようにイベントハンドラを追加します。

切断時の処理

切断時の処理を示します。このときはClientProxyMapとGamesからContext.ConnectionIdをキーとする要素を削除します。また削除されたTypingGameオブジェクトのStopGameメソッドを呼び出し更新処理が行なわれないようにします。また切断処理によって接続されているユーザー数が0になったらTypingGame.StopTimerメソッドを呼び出してTypingGameクラス内にあるタイマーを停止します。

クライアントサイドでゲーム開始の処理が行なわれたときはGameStartメソッドが呼び出されます。この処理が成功したときはクライアントサイドに”EventGameStartToClient”を送信します。

イベントハンドラ

追加されたイベントハンドラに解説します。

クライアントサイドからサーバーサイドに送られてきた文字列がお題の答えとして正しければ”CorrectAnswerEventToClient”を、間違っていれば”IncorrectAnswerEventToClient”をクライアントサイドに送信します。

クライアントサイドからサーバーサイドに送られてきた文字列がお題の答えとして正しければ、TypingGameクラス内で新しいお題がイベントとして送られてきます。この場合はクライアントサイドにお題、制限時間、残り時間mスコア、ライフの引数とともに”SendQuestionToClient”を送信します。またタイマーによって残り時間が変動したときは、クライアントサイドに同引数とともに”UpdateEventToClient”を送信します。

ミスをしたとき、ミスに伴うゲーム中断から復帰するときは、それぞれクライアントサイドに”MissEventToClient”と”ResumeEventToClient”が送信されます。

クライアントサイドからお題の答えを受信する

クライアントサイドからお題の答えが送信された場合は、その文字列を引数にしてTypingGame.CheckAnswerメソッドに渡します。するとTypingGameクラス内で正誤判定が行なわれ、CorrectAnswerEventイベントまたはIncorrectAnswerEventイベントが発生し、上記のイベントハンドラの処理が実行されます。

Program.csを編集します。

Program.cs