これまではランキングを偽装させないためにユーザーとサーバーの間で一対一の処理をおこなってきました。今回は複数のユーザーで情報を共有させます。

タイマーをつかってキーが押されているのであればその方向にキャラクタを移動させます。複数のユーザーでサーバサイドの同じ情報を共有するのでタイマーもそのイベントハンドラもひとつあれば十分なはずです。

ハマりどころ

以下のようなMultiMoveTestHubクラスを定義します。

以降は以下のように省略して書くことにします。

Hubに状態を保存してはならない

キーが押されているかどうかをフラグにセットし、タイマーイベントが発生したときにフラグの状態に応じて処理ができるかどうかやってみたのですが、これではうまくいきません。フラグはつねにfalseです。またコンストラクタをつくって Console.WriteLine(“生成”);と書いておくとキーを操作するたびにコンストラクタが呼び出されていることがわかります。Hubに状態を保存してもこれでは意味をなさないのです。

Playerクラスの定義とキャラクタの移動

そこでPlayerクラスを定義してキーの状態はここに保存します。またConnectionIdをキーにしたPlayerの辞書を静的変数としてMultiMoveTestHubクラス内に定義します。それからGameクラスも静的変数としてMultiMoveTestHubクラス内に定義します。

Playerクラスを示します。キャラクタの座標ですが、X座標とY座標も0以上80以下とします。外に出た場合は反対側にワープさせます。

Gameクラスを独立させて定義する必要はないのですが、今後のために定義しておきます。

MultiMoveTestHubクラスの定義

MultiMoveTestHubクラスを示します。

クライアントサイドの処理

次にクライアントサイドの処理ですが、以下のようにします。自分と他のプレイヤーとでは表示されるイメージを変えます。

Index.cshtml

サーバサイドに接続してデータを送信するときの処理を示します。

Index.cshtml

サーバサイドからのデータを受信したときの処理を示します。

Index.cshtml