ASP.NET Core版 マッピー(MAPPY)をつくる(3)の続きです。

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

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

接続時の処理

接続時の処理を示します。初回だけタイマーの初期化をおこないます。またこのとき接続しているクライアント数が1のとき停止しているタイマーを動作させます。

接続のたびにMappyGameオブジェクトを生成して辞書に追加します。切断された場合は辞書から削除します。MappyGameオブジェクトが生成されたらそのなかにPlayerオブジェクトも生成されるので、イベントハンドラを追加してイベント発生時にはクライアントサイドに送信できるようにしておきます。

切断時の処理

切断時の処理を示します。

イベントハンドラ

プレイヤーがトランポリンでジャンプしたとき、このことをクライアントサイドに送信する処理を示します。

それ以外のイベント発生時の処理も以下に示します。基本的にSendEventToClientメソッドを使い回していますが、引数を別に渡す必要がある場合は別途定義しています。また新しいステージが開始されたときはクライアントサイドに送信したマップを新しいものに更新しないといけないので、後述するSendMapメソッドを実行しています。

マップデータをクライアントに送信する処理

ステージが始まるときにマップデータをクライアントに送信する処理を示します。

MappyGame.MapArray[row, col]を調べてCell.FloorとCell.Ceilingになっている部分が床になります。またドアが設置されている部分は開閉方向が左右どちらなのかわかるように表示させたいのでCell.LeftOpenDoorとCell.LeftOpenPowerDoor、Cell.RightOpenDoorとCell.RightOpenPowerDoorの座標もクライアントサイドに送信します。それから左右の外壁についてもその座標をクライアントサイドに送信します。

ゲーム開始の処理

ゲームを開始するときの処理を示します。

ゲームを開始するときはクライアントサイドからGameStartメソッドが呼び出されるので、ここからMappyGame.GameStartメソッド(既出)を呼び出してゲームを開始します。

更新処理

更新処理がおこなわれるときはMappyGame.Updateメソッド(後述)が呼び出されます。

MappyGame.Updateメソッド

ゲームオーバーのときは何もしません。TimeToStartが0より大きいときはステージクリアと次のステージ開始時の中間の状態なのでTimeToStartをデクリメントして0になったら次のステージを生成してイベントを発生させます。TimeToPlayerReviveが0より大きいときはプレイヤー死亡時なのでTimeToPlayerReviveをデクリメントして0になったら残機ありのときは復活させてゲーム続行、残機0のときはゲームオーバーのイベントを発生させます。

上記以外のときはプレイヤーと敵、火花を更新したあと当たり判定(後述)をおこない、ステージクリア判定をおこないます。

当たり判定

当たり判定の処理を示します。これはMappyGame.HitCheckメソッドを呼び出しておこないます。

更新結果をクライアントサイドに送信する

更新処理の結果をクライアントサイドに送信する処理を示します。

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

ゲームオーバーのときにスコアランキングに登録する処理を示します。これはAspNetCore.SignalRにおける処理 ASP.NET Core版 ボンバーマンのような対戦型ゲームをつくる(3)の終わりのように示しているものとほぼ同じで、違うのはテキストファイルを保存するパスが違うだけです。Zero.Pages.Mappy.HiscoreクラスもASP.NET Core版 ボンバーマンで使用しているHiscoreクラスと同じです。

キー操作時の処理

キーが押されたときの処理をするDownKeyメソッドと離されたときの処理をするUpKeyメソッドを示します。

最後にMappy.MappyHubをProgram.csに追加します。

Program.cs