Slither.io (スリザリオ)のようなオンラインゲームを作りたい(4)の続きです。今回はサーバーサイドとクライアントサイドでデータのやりとりをするためのGameHubクラスを定義します。

準備

Microsoft.AspNetCore.SignalR.Hubクラスを継承してGameHubクラスを定義します。

VisualStudioのプロジェクト作成でASP.NET Core Webアプリを選択を選択するとコードが自動生成されるのですが、Program.csに以下のコードを追加します。追加するのは2行だけでそれ以外は既存のコードです。

Program.cs

接続時の処理

ハブ メソッドの各呼び出しは、新しいハブ インスタンスで実行されるため、変数はすべて静的変数として定義しています。

はじめてユーザーが接続してきたときにタイマーの初期化をおこないます。Elapsedイベントが1秒間に60回発生するようにしてイベントハンドラを追加します。

そのあとキーをASP.NET SignalRで使われるの一意の接続ID、値をIClientProxyにして辞書に登録します。そのあとGame.AddPlayerAsDemoメソッドを呼び出してゲームにデモ画面表示用のプレイヤーとして追加します。これらの処理が滞りなく完了したらクライアントサイドにSendToClientConnectionSuccessfulイベントをフィールドの大きさとともに送信します。

またユーザーが接続したときに接続人数が1人のときはゲームの初期化と停止していたタイマーをスタートさせる処理も実行します。

イベントハンドラを追加する処理を示します。他のプレイヤーを倒したときはSendToClientKillPlayerイベントを、ゲームオーバーになったときはSendToClientGameOveredイベントを送信します。

切断時の処理

ユーザーがページから離脱したときにおこなわれる処理を示します。このときはContext.ConnectionIdを参照してASP.NET SignalRで使われる一意の接続IDを取得し、辞書からこのキーを削除します。またGameオブジェクト内にある辞書からも対応するPlayerを削除します。

ゲーム開始時の処理

ユーザーがゲームを開始しようとした時におこなわれる処理を示します。

一度ゲームオーバーになっている場合は古いPlayerオブジェクトがそのままになっているので先にこれを取り除きます。その結果、プレイヤー数が0になった場合はGameオブジェクトを初期化します。

そのあと新しいPlayerを追加してクライアントサイドに自分の位置のデータを送信します。これらの処理が滞りなく完了したらSendToClientGameStartSuccessfulイベントを送信します。

旋回・ダッシュ時の処理

ユーザーが旋回やダッシュしようとしたときは対応するPlayerオブジェクトのフラグを変更させます。

更新時の処理

更新時の処理を示します。

1 / 60秒おきにElapsedイベントが発生してイベントハンドラTimer_Elapsedが呼び出されます。このときは Game.Update()を呼び出してGameオブジェクトを更新して各クライアントに送信する文字列を取得して送信します。ただしフィールドの状態(プレイヤー数とNPC数)や各プレイヤーの順位情報の送信はデータ送信量を減らすために2秒に1回の割合でおこなうこととします。

次回はラスト。クライアントサイドの処理です。

Slither.io (スリザリオ)のようなオンラインゲームを作りたい(4)の続きです。今回はサーバーサイドとクライアントサイドでデータのやりとりをするためのGameHubクラスを定義します。