前回 ASP.NET Core版 戦車対戦ゲームをつくる(2)の続きです。

TankHubクラスを定義する

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

まずフィールド変数を示します。

接続されたときの処理

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

プレイヤー数の上限は7なので最初に7つのPlayerオブジェクトをNPCとして生成します。そして壁が破壊されたとき、砲弾を発射したとき、砲弾が命中したとき、ゲームオーバーになったときのイベントハンドラを追加します。

接続したときすでにプレイしているユーザーが7人存在する場合はゲームに参加することはできません。この場合は別のページにリダイレクトさせて今はゲームに参加できないことを伝えます。

プレイしているユーザーが6人以下の場合はNPCのうちひとつをNPCのリストから取り除き、プレイヤーとして追加します。そのあとクライアントサイドで描画処理ができるように存在する壁の座標をクライアントサイドに送信します。

すべてのユーザーが離脱して新たに一人目のユーザーが接続した場合は破壊された壁をもとに戻してゲームを新たに開始します。

切断されたときの処理

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

切断されたときはPlayers辞書から切断されたプレイヤーに対応する要素を取り除き、NPCのリストに追加します。またクライアントサイドにデータを送信する必要はなくなるのでClientProxyMapとHubCallerContextsからも要素を取り除きます。

切断された結果、接続されているユーザーが0になった場合はタイマーを停止させます。

ゲームオーバーになったときは強制的に切断します。以下はconnectionIDを指定してAspNetCore.SignalRによる通信を切断するメソッドです。

タイマーイベント発生時の処理

タイマーイベントが発生したときの処理を示します。プレイヤーとNPCの更新処理をおこなったあと当たり判定の処理をおこないます。そのあとプレイヤーとNPCの状態をクライアントサイドに送信します。

当たり判定の処理

当たり判定の処理を示します。

クライアントサイドへのデータ送信

クライアントサイドへのデータを送信する処理を示します。

ReceiveStartUpdateを送信し、そのあと戦車の位置、砲弾の位置、非表示にすべき壁、スコア、残機数を送信します。これはクライアントサイドでうけとり一旦配列内に格納します。必要なデータをすべて送信したら最後にReceiveEndUpdateを送信してクライアントサイドで描画処理をおこなわせます。

イベントハンドラ

砲弾を発射したときと命中したときのイベントハンドラを示します。

ゲームオーバー時の処理

ゲームオーバーになったときの処理を示します。

クライアントサイドにゲームオーバーになったことを送信し、通信を切断します。それと同時にスコアランキングへの登録の処理もおこないます。

スコアランキングへの登録

スコアランキングに登録する処理を示します。

まずスコアを管理するためのクラスを定義します。

次にスコアランキングに登録する処理を示します。ゲームオーバー時のスコアが上位30以内にはいっているかどうかを調べて入っている場合はプレイヤー名とスコア、そのときの時刻を登録します。

キー操作への対応

キー操作をおこなったときの処理を示します。