ASP.NET Core版 対戦型ラリーエックスをつくる(3)の続きですクライアントサイドにおける処理を考えます。

cshtmlファイル

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

Pages\RallyX\game.cshtml

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

blue-car-e.png
blue-car-n.png
blue-car-s.png
blue-car-w.png
blue-car.png

red-car-e.png
red-car-n.png
red-car-s.png
red-car-w.png
red-car.png

green-car-e.png
green-car-n.png
green-car-s.png
green-car-w.png
green-car.png

blue-smoke.png
red-smoke.png
green-smoke.png

flag.png
wall.png

spark1.png
spark2.png
spark3.png
spark4.png
spark5.png
spark6.png

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

bgm.mp3
flag.mp3
smoke.mp3
dead.mp3
explotion.mp3
gameover.mp3
notification.mp3

JavaScript部分

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

グローバル変数

wwwroot\rally-x\app.js

初期化の処理

ページが読み込まれたときの処理を示します。ここではcanvasの初期化、ゲームの説明を表示させるための処理とBGMをエンドレスで再生するための処理、プレイヤーのスコアや名前を表示する部分の初期化などをおこなっています。

接続成功時の処理

接続に成功したらIDを表示させます。また壁と煙幕の座標が送られてくるのでそれを配列に格納しておきます。

ゲーム開始の処理

キー操作

更新処理

更新処理がおこなわれるときはサーバーサイドからStartUpdateToClientが送られてきます。そのあと更新処理に必要なデータが送られてくるので配列に一時的に格納しておきます。最後にEndUpdateToClientが送られてくるので描画処理をおこないます。

プレイヤーの座標、移動方向、燃料などがUpdatePlayer1ToClientで送られてきます。自機の場合はplayerX、playerY、playerFuel、isPlayerDead、invincibleTimeにも保存しておきます。

プレイヤーネームやスコア、残機はUpdatePlayer2ToClientで送信されます。これも変数と配列に保存しておきます。

未通過のフラッグの位置はUpdateFlagsToClientで送られてきます。

新しく生成された煙幕と消滅した煙幕の位置はUpdateSmokesToClientで送られてきます。送られてきたデータを配列に変換して、removeXs、smokeYs、smokeNumbersの各要素を加除します。

火花の座標と消滅までの時間はUpdateSparksToClientで送られてきます。これも配列に格納しておきます。

現在、プレイ中なのか? ゲームに参加できる状態なのか? 参加中であればプレイヤー名と車の色は何か、スコアや残機の情報を表示させるための情報はUpdateGameStatusToClientで送られてきます。

GetPlayerName関数はページに表示させるプレイヤー名をエスケープ処理をしたあと取得するためのものです。

更新用のデータがサーバーサイドからすべて送られてきたら最後にEndUpdateToClientが送られてきます。これを受信したら描画処理をおこないます。

プレイヤー情報の表示

ゲームにユーザーが参加したとか離脱したという情報はNotificationToClientとNotificationToClient2で送られてきます。両者の違いは効果音を伴うかどうかです。

描画処理

GetShiftXY関数は自機を中央に描画するためにそれ以外のものをどれだけ平行移動させるかを取得するためのものです。

DrawWalls関数は名前のとおり壁を描画します。

DrawPlayers関数は車を描画します。進行方向と車の種類にあわせて適切なイメージで描画します。

フラッグ、煙幕、火花を描画します。

canvasの右側に燃料系とレーダーを描画します。

サーバーサイドからIsTimeBetweenStagesToClientが送られてきたら、ここから現在はステージとステージのあいだなのか、そのときに表示すべき文字列を取得することができます。

効果音

PlayBGMIfNeed関数はBGMが最後まで再生されているのであれば、最初から再生しなおします。

StopBGM関数はBGMを停止します。

フラッグがある位置を通過したらサーバーサイドからGetFlagToClientが送られてきます。そのときに効果音を鳴らします。

煙幕を放出したらサーバーサイドからSmokeToClientが送られてきます。そのときも効果音を鳴らします。

プレイヤーが撃破された場合、別のプレイヤーを撃破した場合、それぞれPlayerDeadToClientとEnemyDeadToClientが送られてきます。その場合も効果音を鳴らします。

ゲームオーバーになったときはサーバーサイドからGameOverToClientが送られてきます。画面にゲームオーバーと表示してBGMを停止、効果音を鳴らします。