オンライン対戦型のスネークゲームをつくる(1)の続きです。今回はプレイヤーと餌の当たり判定とスコアの加算減算処理、イベント送信などをおこなうGameクラスとクライアントサイドとのデータ送受信をするHubクラス(ChamatherioHubクラス)の定義をおこないます。

Gameクラスの定義

Gameクラスを定義します。以下、記事内では名前空間部分は省略します。

プロパティ

各プロパティを示します。PlayerとFoodのリストです。

初期化

コンストラクタとフィールド変数、イベントを示します。

最初のユーザーがゲームを開始するとプレイヤーの位置のリセットなどの初期化の処理がおこなわれます。

更新処理

更新処理では各キャラクターの座標の移動と当たり判定をおこないます。また当たり判定の結果、スコアの加算または減算、イベントの送信がおこなわれます。

イベントの送信

餌を食べたとき効果音を鳴らしたいのでクライアントサイドにイベントを送信します。どのクライアントに送信するかも指定できるようにIDを引数に渡します。

他のプレイヤーを倒したときは1000点を加算します。これも効果音を鳴らしたいのでクライアントサイドにイベントを送信します。

死亡したときもクライアントサイドにイベントを送信します。食べると即死する餌を食べた場合、0.1秒待機していますが、これはサーバーサイドでは死亡判定されてもクライアントサイドは食べると即死する餌として表示されていない場合があるからです。更新間隔が長いとこういう問題が発生します。ユーザーが「え?何で死ぬの?」と思わないように、確実に食べると即死する餌が表示させるために0.1秒待機しています。

GotScoreイベント、LostScoreイベント、Killイベント、GameOvered1イベント、GameOvered2イベントの引数で使われるMyEventArgsクラスの定義を示します。EventArgsクラスにASP.NET SignalR の接続IDを追加しているだけです。

Hubクラスの定義

これまで作ってきたオンライン対戦ゲームと同様、ASP.NET SignalRを使用しています。ここではChamatherioHubクラスを定義します。以下、記事内では名前空間部分は省略します。

フィールド変数は以下のとおりです。

接続時の処理

ユーザーが接続したときの処理を示します。

最初の接続時だけタイマーの初期化の処理とイベントハンドラの追加の処理をおこなっています。そのあと辞書に接続IDとIClientProxyを追加し、クライアントサイドに接続成功とフィールド全体の幅高さを通知しています。

イベントハンドラを示します。効果音を鳴らすためにクライアントサイドにイベントを送信しています。

切断時の処理

ユーザーが接続を切断したときの処理を示します。

辞書から接続IDを削除します。プレイ中のユーザーが離脱した場合はPlayerをNPCに戻します。また接続ユーザー数が0になったら更新処理用のタイマーを停止します。

ゲーム開始時の処理

ユーザーがゲームを開始したときの処理を示します。

最大9人でプレイできますが、新規ユーザーが参入しようとしたときはNPCが存在するか調べます。存在する場合はそれをユーザーが操作できるようにします。NPCが存在しない場合はすでに定員オーバーなのでゲームに参加できない旨を通知します。

更新処理

更新処理をしてクライアントサイドに描画用のデータを送信する処理を示します。

ユーザーによる操作への対応

ユーザーがボタンを操作してプレイヤーの方向転換をしようとしたときにおこなわれる処理を示します。