オンライン対戦型のスネークゲームをつくる(2)の続きです。今回はクライアントサイドの処理を実装します。

cshtml部分

cshtmlファイルに記述する部分を示します。

Pages\chama-ther-io\game.cshtml

cssを示します。

wwwroot\chama-ther-io\style.css

その他、キャラクターの描画や効果音に使う音声は wwwroot\chama-ther-io\imagesフォルダとwwwroot\chama-ther-io\soundsフォルダにいれてあります。

JavaScript部分

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

wwwroot\chama-ther-io\app.js

初期化

ページを読み込んだときの処理を示します。

プレイヤー操作用のボタンはゲームが開始されるまで意味をなさないので非表示とします。描画で用いるimageの初期化し、イベントリスナーを追加します。

initImages関数は描画で用いるimageを配列に格納します。

initVolumes関数は効果音のボリューム調整を可能にする処理をおこないます。

イベントリスナー追加の処理を示します。ボタンをクリックしたりPCのキー操作でゲームを開始したりプレイヤーの操作ができるようにします。

ASP.NET SignalR の接続に成功したときの処理を示します。サーバーサイドから”SendToClientConnectionSuccessful”が送信され同時にフィールド全体の大きさと接続IDが送られてくるのでグローバル変数に保存しておきます。

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

ゲーム開始時の処理

ゲーム開始時の処理を示します。入力されているプレイヤー名をサーバーサイドに送ります。

ゲーム開始処理が正常に行なわれた場合は”SendToClientGameStartSuccessful”、ゲームに参加できなかった場合は”SendToClientGameStartFailure”がサーバーサイドから送られてくるので、ゲーム開始処理が正常に行なわれた場合はスタートボタンを非表示にしてプレイヤー操作用のボタンを表示させます。ゲームに参加できなかった場合はその旨を表示させます。

描画更新の処理

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

サーバーサイドから送られてきたカンマ区切りの文字列を分解してフィールド全体におけるプレイヤーの現在の座標を求めます。そのぶん全体を平行移動して描画すればプレイヤーが中央に表示されるようになります。

フィールドの壁を描画します。

餌を描画します。サーバーサイドからタブ文字区切りで餌の情報が送られてくるので、これを分解して配列にします。さらに餌のX座標とY座標、種類がカンマ区切りで記されているので、これらの情報から餌の描画をおこないます。

餌同士が重なっている場合、食べると即死する餌が見えないと困るので、食べると即死する餌、食べると減点される餌、通常の餌の順に描画します。

プレイヤーを描画する処理を示します。

ユーザーのスコアを描画します。

現在プレイ中の上位3名のスコアを描画します。

効果音の再生

加点、減点時の効果音を鳴らす処理を示します。加点時は”SendToClientGotScore”、減点時は”SendToClientLostScore”、他のプレイヤーを倒したときは”SendToClientKill”がサーバーサイドから送られてくるので、それぞれに対応した効果音を鳴らします。

ゲームオーバー時の処理

ゲームオーバー時の処理を示します。ゲームオーバーになるケースとして(1)壁や自分の胴体、他のプレイヤーに衝突した場合、(2)食べると即死する餌を食べてしまった場合の2つがあります。それぞれに対応したプレイヤー死亡を知らせる効果音を鳴らします。

同時にプレイヤー操作用のボタンを非表示にします。そのあとゲームオーバーの効果音を鳴らし、さらにしばらく待機したあとゲーム再挑戦用のボタンを表示させます。