クソゲーに魂を!プロジェクト(5)の続きです。今回はクライアントサイドにおける処理を定義します。

cshtml部分

cshtml部分とCSSを示します。

Pages\fire-snake\Index.cshtml

wwwroot\fire-snake\style.css

グローバル変数と定数

グローバル変数と定数を示します。

wwwroot\fire-snake\app.js

各クラスの定義

Playerと弾丸、餌を描画するためのデータをうけとったあと実際に描画処理をおこなうことができるように各クラスを定義しておきます。

Playerクラス

コンストラクタの引数はPlayerID、初期座標、初期の移動方向、PlayerName、ユーザーかNPCかを示すbool変数です。

Init関数は現在の体長と旋回方向、身体の各オブジェクトの座標からスネークを描画できるようにデータをセットするためのものです。

Add関数は新しい円を追加することでスネークが移動したように見せかけるためのものです。オブジェクトに現在の頭の座標と進行方向、旋回状態が記録されているのでこれらから新しい頭の位置を計算して円を追加しています。

SetLength関数は体長を変化させます。体長で太さも変化します。

Bodyオブジェクトにはスネークの身体にあたる円の中心座標が格納されます。

Bulletクラス

弾丸は発射されたら同じ速度で飛び続けるので初期座標と進行方向、タイプ、寿命が与えられたらクライアントサイドで処理をすることができます(当たり判定があったらサーバーサイドからその旨通知されるので消滅させる処理をすればよい)。

Foodクラス

餌の場合もだいたい同じように処理をすることができます。

ページが読み込まれたときの処理

ページが読み込まれたときにおこなわれる処理を示します。

ページが読み込まれたらPlayerNameを入力するテキストボックスを表示して過去に入力した文字列があるのであればそれをローカルストレージから読み出してこれを表示します。そのあと描画にもちいるイメージの初期化、イベントリスナの追加、ボリューム調整用のレンジスライダーの初期化、ASP.NET SignalRでコネクションを確立する処理をおこないます。

端末によってレイアウトを切り替える処理を示します。

描画にもちいるイメージを初期化します。

イベントリスナを追加する処理を示します。スタートボタンを押下したらゲームスタート、ボタンやキーを押下しているあいだはその方向に移動処理がおこなわれるようにしているだけです。

レンジスライダーでボリューム調整できるようにする処理を示します。この部分はいつもと同じです。

接続成功時の処理

ASP.NET SignalRによる接続が成功した時におこなわれる処理を示します。

接続に成功したらサーバーサイドから”SendToClientConnectionSuccessful”とフィールドを描画するためのデータが送信されるので描画に必要なデータをグローバル変数に保存しておきます。

通信が切れてしまったときの再接続時の処理

通信が切れてしまったあと再接続されたときにおこなわれる処理を示します。

なんらかの原因で通信が切れてしまったときは0.1秒後に再接続を試みます。再接続に失敗したときはさらに1秒待ってからもう一度再接続を試みます。それでもダメならなにもせず接続失敗を伝えるメッセージを表示します。

ゲーム開始時の処理

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

テキストボックスに入力されている文字列をPlayerNameとしてサーバーサイドに送信します。この処理が成功したときはサーバーサイドから”SendToClientGameStartSuccessful”が送信されます。

ゲーム開始の処理が成功したときにおこなわれる処理を示します。

isGameoveredフラグをクリアしてPlayerName入力用のテキストボックスを非表示にします。端末がスマホのときは操作用のボタンを表示します。そのあとBGMを再生します。

ゲームオーバー時の処理

ゲームオーバー時におこなわれる処理を示します。

isGameoveredフラグをセットしてスマホでプレイしていた場合は操作用ボタンを非表示にします。またBGMを停止してミス時の効果音を鳴らします。しばらく待機したあとゲームオーバーの効果音とゲームスタート用のボタン、PlayerName入力用のテキストボックスを再表示させます。

効果音の再生

サーバーサイドからイベントが送信されたときはそれに応じた効果音を鳴らします。

サーバーサイドから送信された”SendToClientPing”を受信したときはPing値を計算してグローバル変数に格納しておきます。

更新と描画の処理

更新と描画の処理を示します。

更新に必要なデータをサーバーサイドから受信したときはこれを解析して描画用のオブジェクトを更新します。

Playerの更新

受信した文字列からPlayerオブジェクトを更新する処理を示します。

Bulletの更新

受信した文字列からBulletオブジェクトを更新する処理を示します。

Foodの更新

受信した文字列からFoodオブジェクトを更新する処理を示します。

描画

更新されたオブジェクトを描画する処理を示します。

まず自機の頭部がcanvasの中心に描画されるようにするにはどれだけ全体をズラさなければならないか計算します。あとはその分だけズラして各オブジェクトを描画するだけです。

フィールドの境界線を描画する処理を示します。

スネークの身体と頭を描画する処理を示します。

バトルが終了したら勝者に関する情報を描画する処理を示します。

フィールドの状態を表示する

“SendToClientUpdateFieldStatus”を受信したらフィールドの状態(生存するPlayer数や自機の座標、残り時間など)をページ上に表示します。

レーダーへの描画

“SendToClientUpdateRadar”を受信したらレーダーに各Playerの位置を描画します。

“SendToClientUpdatePlayersStatus”を受信したらページ下部に現在参戦しているPlayerの情報を表示します。