ASP.NET Core版 ボンバーマンのような対戦型ゲームをつくる(3)の続きです。

cshtmlファイル

Pages\Bomber\game.cshtml

ここではPages\Bomberフォルダ内にgame.cshtmlファイルを作成します。そしてgame.cshtmlには以下のように記述します。

またwwwroot\bomberフォルダ内には以下のファイルを置きます。

player1.png
player2.png
player3.png
player4.png
bomb1.png
bomb2.png
fire1.png
fire2.png
fire3.png
fire4.png
fire5.png
fire6.png
wall1.png
wall2.png

それから音声ファイルとして以下を準備しました。

explotion.mp3
dead.mp3
gameover.mp3
notification.mp3

JavaScript部分

次にJavaScriptですが、wwwroot\bomberフォルダ内にapp.jsを作成します。

グローバル変数

まずグローバル変数を宣言します。

wwwroot\bomber\app.js

以下は更新処理用のグローバル変数です。

wwwroot\bomber\app.js

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

ページが読み込まれたらCANVASのサイズを設定してボリュームをうるさくない音量(経験的に0.03くらいがよさそう)に設定します。

それからページにアクセスしたらAspNetCore.SignalRで接続を開始します。

接続に成功したらそれがわかるようにメッセージを表示させます。

ゲームに参加したときの処理

「ゲームスタート」のボタンをクリックしたらサーバーサイドにプレイヤー名とIDを送信します。これによってBomberHubクラスのGameStartメソッドが呼び出されゲームに参加することができます。

キーが押されたときの処理

キーが押されたらサーバーサイドにこれを送信します。サーバーサイドでは対応するPlayerオブジェクトが生成されているのであれば処理がおこなわれます。観戦しているだけで参加していない場合はなにも起きません。

更新処理

更新処理に関する関数を示します。

更新処理の開始を知らせるためにサーバーサイドからReceiveStartUpdateが送られてきます。このときに描画処理に必要なデータを一時的に保存しておく配列を初期化します。

更新すべきデータを受信したときの処理を示します。ライバルや爆弾、火花、破壊された壁の位置や状態など配列に格納すべきデータが文字列で送られてくるので配列に変換して保存しておきます。自機に関するデータはそのままNumber型で送られてくるのでそのまま格納します。

更新すべきデータがすべて送られたら最後にReceiveEndUpdateが送られてきます。その場合は描画処理をおこないます。自機は黄色いひよこにしてそれ以外のプレイヤーは3種類のべつのイメージを使います。

プレイヤーが生存している場合は描画し、死亡している場合は表示しません。無敵状態のときは点滅させるのでこの処理が実行された回数をカウントして偶数回、奇数回で表示非表示を切り替えています。

また爆発の火花は消滅するまでの時間でイメージを切り替えて爆発っぽく描画しています。

Canvasの隣に自分と他のプレイヤーの名前と残機、スコアを表示させます。NPCの場合は残機とスコアの概念はないのでそれらは表示させません。

それ以外の通知の表示

プレイヤーが参戦したりゲームオーバーになったり試合放棄した場合もサーバーサイドからデータが送られてきます。ReceiveNotificationを受信したらそれを表示します。通知は配列のなかに格納し、3秒後に消します。また音を鳴らす設定の場合は通知音を鳴らします。

爆発音、ゲームオーバー時の効果音の再生

クライアントサイドでReceiveBombExploded、ReceivePlayerDead、ReceiveGameOverを受信したときは爆弾が爆発したりプレイヤーが死亡したりゲームオーバーになったときです。この場合は効果音を鳴らします。その処理を示します。