ディフェンダーに似たオンライン対戦ゲームをつくる(3)の続きです。今回はクライアントサイドの処理を実装します。

HTML部分

Pages\defender\game.cshtml

CSS

wwwroot\defender\style.css

JavaScript部分

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

wwwroot\defender\app.js

レンジスライダーでボリューム変更

ボリュームを調整するための処理を示します。レンジスライダーを操作するとボリュームを変更できるようにしています。

wwwroot\defender\app.js

Starクラスの定義

星を描画するためにStarクラスを定義します。

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

ページが読み込まれたら画像ファイルを読み込んでイメージを配列に格納します。

キー操作で自機を操作できるようにする

追加するイベントリスナーを示します。プレイ中のみ(正確にはプレイ中とゲームオーバー直後の3秒間)’ArrowUp’, ‘ArrowDown’, ‘ArrowLeft’, ‘ArrowRight’, ‘Space’キーのデフォルトの動作を抑止します。’ArrowUp’を押下すると上へ加速、’ArrowDown’を押下すると下へ加速、’ArrowLeft’, ‘ArrowRight’を押下しているあいだは左右に移動するようにします。

マウス操作とタップで自機を操作できるようにする

追加するイベントリスナーを示します。

ハブに接続したときの処理

接続に成功したらconnectionIDをグローバル変数に格納し、切断されたら空文字列を格納します。

ゲーム開始時の処理

ゲーム開始ボタンがクリックされたらサーバーサイドから”GameStart”メソッドを呼び出します。このときユーザーが設定したプレイヤー名もいっしょに送信します。

ゲームの開始処理が成功したらサーバーサイドから”SendToClientGameStartSuccessful”が送られてくるので、そのときはスタートボタンとプレイヤー名設定用のテキストボックスを非表示にします。またisPlayingフラグとpreventDefaultフラグをセットします。

失敗したときはプレイヤー数の上限を超えているということなので、ゲームに参加できない旨を表示させます。

プレイヤーの描画

サーバーサイドから送られてきた文字列からプレイヤーを描画する処理を示します。

文字列を改行で分割した場合、最初の部分がプレイヤーに関する情報です。座標、スコア、方向、残機数などプレイヤーの情報はカンマ区切りの文字列になっていて、複数のプレイヤーの情報がタブ文字区切りで送られてくるので、これを解析します。自分自身であれば自機として描画します。それ以外のプレイヤーは別のイメージを使って描画します。

自機をcanvasの中央付近に描画するためにフィールド上の座標からどれだけズラして描画するかを第二引数で指定しています。

敵を描画する

サーバーサイドから送られてきた文字列から敵を描画する処理を示します。

文字列を改行で分割した場合、3番目の部分が敵に関する情報です。敵の座標や状態がカンマ区切りの文字列になっていて、複数の敵の情報がタブ文字区切りで送られてくるので、これを解析して適切な位置に描画します。

弾丸の描画

サーバーサイドから送られてきた文字列から弾丸を描画する処理を示します。

文字列を改行で分割した場合、2番目の部分がプレイヤーが発射した弾丸で、4番目が敵が発射した弾丸の情報です。敵と他のプレイヤーが発射した弾丸は自分が発射した弾丸とは別のイメージで描画します。これも座標や状態がカンマ区切りの文字列になっていて、複数の敵の情報がタブ文字区切りで送られてくるので、これを解析して適切な位置に描画します。

火花を描画する

サーバーサイドから送られてきた文字列から火花を描画する処理を示します。

文字列を改行で分割した場合、5番目の部分が火花の情報です。これも座標や状態がカンマ区切りの文字列になっていて、複数の火花の情報がタブ文字区切りで送られてくるので、これを解析して適切な位置に描画します。

スコアの表示

スコアを表示する処理を示します。プレイヤーを描画するときに使用した文字列を使って、プレイヤーのスコアのなかからユーザー自身のものを取り出して描画します。

更新処理

フィールド上に存在するキャラクターをどれだけ垂直方向にズラして描画するのかを求める処理を示します。

ユーザー自身のプレイヤーを中央付近に描画するのですが、進行方向によって中央から100ピクセル上下にズラします。また進行方向を反転したとき急に描画される座標が変わらないようにゆっくり変化させます。そのためグローバル変数curYを定義しています。死亡時はゆっくりcurYを0に戻します。

もし戻り値がnullである場合はユーザー自身はプレイをしていないことになります。

canvasの下部にプレイ中の上位3名の名前とスコアを描画します。

サーバーサイドから文字列が送られてきたら上記の関数をつかって描画処理をおこないます。

効果音を鳴らす

スピードアップや弾丸の発射をしたときは効果音を鳴らします。

ゲームオーバー時の処理

ゲームオーバー時はisPlayingフラグをクリアしてゲームオーバー時の効果音を鳴らします。その3秒後にスタートボタンを表示させ、キー操作時のデフォルトの動作を抑制するフラグをクリアします。