Three.jsでPOLAR STAR(ポーラースター)のようなゲームを作る(1)の続きです。前回定義したクラスを用いてゲームを完成させます。

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

ページが読み込まれたときにおこなわれる処理を示します。

sceneに直線を追加

sceneに縦横の直線を追加する処理を示します。

自機が前進しているように見せかけるため水平な直線を移動できるようにします(実際にはカメラは初期位置から移動しない。背景に相当する水平な直線を移動させている)。水平な直線の3Dオブジェクトを生成したら配列 lineEWs に格納しておきます。

イベントリスナの追加

イベントリスナを追加する処理を示します。移動用のボタンやキーが押下されたり離されたら該当するフラグのセットまたはクリアをして更新処理時に自機の移動がおこなわれるようにします。またスマホだと弾丸発射ボタンを連打するのは難しいので、pressShotButtonフラグをセットすることで押下したままなら連射できるようにしています。

また[スマホ用操作用ボタンを非表示] の状態が変化したときは、プレイ中であり[非表示]にチェックがされていないときだけ操作用のボタンを表示させるようにしています。

レンジスライダーでボリューム調整できるようにする

レンジスライダーでボリューム調整できるようにする処理を示します。ここでは elementId で指定した divタグのなかにスライダーや音量を示す値、音量テスト用のボタンを追加する処理をおこなっています(コピペで他のゲームでも使えるはず)。

ゲーム開始時の処理

ゲーム開始時の処理を示します。プレイが開始されるので

isPlayingをtrueに、isGameoveredをfalseに変更します。また矢印キーを押下したときのデフォルトの動作を抑制するためにpreventDefaultフラグをtrueにします。

スコア、ステージ、残機数をリセットします。前のプレイでのオブジェクトや3Dオブジェクトが残っている場合があるので、これらをすべてクリアします。要塞の描画位置を初期化します。BGMタイプ1の再生を開始するとともにチェックボックスの状態を調べて必要であればスマホ用操作ボタンを表示させ、スタートボタン等を非表示にします。

更新処理と当たり判定

更新処理を示します。

当たり判定

自機が発射した弾丸と敵との当たり判定の処理を示します。衝突したオブジェクトは死亡フラグをセットしてsceneから取り除きます。

敵が発射した弾丸と自機との当たり判定の処理を示します。

敵本体と自機との当たり判定の処理を示します。

自機が発射した弾丸と敵要塞のコアとの当たり判定の処理を示します。

命中時の処理

ザコ敵に弾丸が命中したときの処理を示します。スコアを加算して効果音を鳴らし火花を生成しています。

要塞のコアに弾丸が命中したときの処理を示します。スコアを加算して効果音を鳴らし要塞を大爆発させたあと、周囲のザコ敵もいっしょに爆発させています。

周囲のザコ敵もいっしょに爆発させる処理を示します。

自機死亡時の処理

自機死亡時の処理を示します。

残基を減らして 0 になっていないなら要塞を少し遠ざけてプレイを再開し、0 になったらゲームオーバーの処理をおこなっています。そのさい対ボス戦のBGMが再生されている場合は停止します。理由は自機の再出発点はコアの射程圏外となるからです。

残機が存在する場合は自機死亡から3秒後に自機を復活させますが、このときにフィールド上に存在する敵や弾丸はすべて取り除きます。また復活時は要塞が現在位置から50遠ざかった位置となります。

sceneと配列から敵と弾丸をすべて取り除き、自機を初期位置に戻す処理を示します。

描画と3Dオブジェクトのレンダリング

レーダーへの描画と3Dオブジェクトのレンダリングの処理を示します。

画面上部にスコア等を描画する処理を示します。

要塞との距離を示す部分は距離が離れているときは距離を、コアを射程圏内におさめているときはチャージされたパーセンテージや発射準備が完了した旨を示す文字列を表示しています。あとはDOM要素を取得して変数と文字列を書き込んでいるだけです。

ゲームオーバー処理

ゲームオーバー処理を示します。BGMを停止してスマホ操作用ボタンを非表示にします。3秒待機したあとゲームオーバーの効果音を鳴らしてゲーム再開用のボタンを再表示させます。

スコアランキングを記録する処理を示します。プレイヤー名とスコアをPOSTします。

POSTされたデータは以下の処理でcsvファイルに保存します。

save-data.php