ボスコニアンのようなオンライン対戦ゲームをつくる(4)の続きです。今回はクライアントサイドの処理を実装します。

cshtml部分

まずcshtmlファイルを作成してPagesフォルダの配下におきます。

Pages\bosconian\game.cshtml

cssを示します。

wwwroot\bosconian\style.css

その他、描画に使う自機、他のプレイヤーの機体、敵機、要塞、砲台などの画像はwwwroot\bosconian\imagesフォルダ内に、効果音はwwwroot\bosconian\soundsフォルダ内に配置します。

JavaScript部分

次にJavaScript部分を示します。

主なグローバル変数と定数

まずは主なグローバル変数と定数です。今回はcanvas要素を2つ使います。ひとつはフィールドの描画用、もうひとつはプレイヤーと要塞の位置を表示するレーダーと上位3名のスコアの描画用です。

wwwroot\bosconian\app.js

Starクラスの定義

背景に描画する星の位置情報を格納するStarクラスを定義します。

wwwroot\bosconian\app.js

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

ページが読み込まれたときの処理を示します。

initButtons関数は自機操作用のボタンを初期化します。また0.5秒おきに現在プレイ中か?チェックボックスでボタンは表示する設定になっているかを確認してボタンの表示/非表示を切り替えています。

initImages関数は画像ファイルを読み込んでイメージを変数、配列に格納します。

addEventListeners関数はイベントリスナーを追加します。

initVolumes関数はレンジスライダーを操作することでボリュームをコントロールできるようにします。

接続成功時の処理

ASP.NET SignalRでサーバーサイドへの接続が成功したら”SendToClientConnectionSuccessful”が送られてくるので、IDを保存しておきます。また星をランダムに生成して配列に格納します。

ゲーム開始時の処理

ゲーム開始時の処理を示します。

プレイヤー名を取得して、これを引数にしてサーバーサイドからGameStartメソッドを呼び出します。

ゲーム開始の処理が正常に行なわれたら”SendToClientGameStartSuccessful”が送られてくるので、そのときはスタートボタンを非表示にしてBGMの再生を開始します。

ゲーム開始の処理が正常に行なわれなかった場合は”SendToClientGameStartFailure”が送られてくるので、そのときはゲームの開始処理が失敗した旨を表示します。

通信が切れたらその旨を表示します。

更新処理

更新時の処理を示します。

データが更新されたときはサーバーサイドから”SendToClientUpdate”とjsonテキストが送られてくるので、これをオブジェクトに変換して描画処理をおこないます。

clearCanvas関数はcanvas全体をいったん黒で塗りつぶします。またレーダーを表示する矩形部分を青で塗りつぶします。

getMyPosition関数はフィールド上の自機の座標を取得します。

弾丸の描画

drawBullets関数は弾丸を描画する処理をおこないます。

自機から発射された弾丸を白い線で描画します。このとき弾丸のXY方向の速度でどの2点を結ぶ直線を描画するのかを計算する必要があります。

敵と他のプレイヤーが発射した弾丸を描画する処理を示します。

要塞の描画

要塞を描画する処理を示します。生成されたばかりの要塞は点滅処理をさせるのでIsJustBornプロパティがtrueの場合は2回に1回しか描画しません。ちょっと処理が長くなったので、中心部分の描画と砲台部分の描画処理をわけました。

中心部分と砲台をつなぐ部分の描画する処理を示します。

砲台部分を描画する処理を示します。

レーダーへの表示

blotMap関数はレーダーに自機と他のプレイヤー、要塞の位置を描画します。

敵の描画

敵も生成されたばかりのものは点滅表示させるのでIsJustBornプロパティがtrueのときは2回に1回の描画とします。

プレイヤーの描画

プレイヤーを描画する処理を示します。死亡したプレイヤーは描画しません。機体のXY方向の移動速度から機体の向きを調べて適切なイメージを使用します。

死亡状態から復帰したばかりのプレイヤーは点滅表示させますが、ここではIsShowプロパティを使って描画するかどうかを判断します。

火花の描画

火花を描画する処理を示します。

スコアの描画

canvas上部にスコアと残機を描画する処理を示します。

上位3名のプレイヤー名とスコアを描画する処理を示します。

効果音の再生

自機から弾丸が発射されたらサーバーサイドから”SendToClientShoted”が送信されるので、そのときは効果音を再生します。

自機が敵を撃墜したときはサーバーサイドから”SendToClientHitEnemy”が、自機が要塞の中心部を破壊したときはサーバーサイドから”SendToClientHitEnemy”が、自機が死亡したときは”SendToClientPlayerDead”がそれぞれ送られてくるので、そのときは対応する効果音を鳴らします。

ゲームオーバー時の処理

ゲームオーバーになったらサーバーサイドから”SendToClientPlayerGameOvered”が送られてくるので、この場合はisPlayingフラグのクリア、BGMの停止、BGM再生用のインターバルの削除をおこないます。そしてゲームオーバーの効果音を鳴らします。そのあと非表示になっていたゲームスタートボタンを再表示させます。