レーザーと爆発のエフェクトをつかってゲームをつくる(2) の続きです。今回は前回定義したクラスを使ってゲームを完成させます。

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

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

自機た敵、敵弾の描画処理ができるようにImageオブジェクトに画像ファイルを読み込ませます。そのあとcanvasのサイズの調整、イベントリスナの追加、チェックボックスの初期化、連続発射処理の初期化をおこないます。

addEventListeners関数は必要なイベントリスナを追加します。各ボタンがクリックされたとき、PCでキー操作がされたとき、レンジスライダーを操作したときに適切な処理がおこなわれるようにします。

スマホで自機の操作をしながらレーザーの発射をするのは難しいので自動的に連続発射するようにします。PCユーザーの場合はチェックボックスで切り替えることができるようにします。

自動で連続発射処理をするのは、自機が生存している場合で、チェックボックスがONのときだけです。またlasers内にLaserオブジェクトが18個以上格納されている場合も発射はしません。lasers.length < 18という条件を入れているのは、requestAnimationFrameが一時的に止まったときに次から次へとLaserオブジェクトが配列内に追加されるのを防ぐためです。

更新処理

更新処理を示します。

まずゲームがプレイ中のときは[スマホ用の操作ボタンを隠す]がチェックされている場合、操作用のボタンを非表示にします。またプレイ中でない場合も操作用のボタンは非表示にします。

ゲームオーバーのときはそれ以上の処理はしません。

プレイ中のときは各オブジェクトの状態を更新します。その後、当たり判定をして死亡フラグがセットされているオブジェクトを配列のなかから取り除きます。そのあと敵の弾丸発射の処理と新しい敵を生成する処理をして描画処理をおこないます。

当たり判定

当たり判定の処理を示します。

ここでは ① 自機から発射された弾丸は敵に命中したか? ② 敵から発射された弾丸は自機に命中したか? ③ 自機と敵は衝突したか?を調べますが、自機死亡時と自機が無敵状態のときは ② と ③ はおこなわれません。

命中時の処理

命中時の処理を示します。敵を倒したときはスコアを加算し、爆発の処理と効果音の再生をおこないます。

敵や敵弾に当たったときはLifeを減算し、爆発の処理と効果音の再生をおこないます。またLife減算の結果、Lifeが0以下になったときはゲームオーバーの処理をおこないます。

ゲームオーバーになったら自機を大爆発させ、2秒後に’GAME OVER’の文字列を描画します。player.Gameovered = trueとすることで描画更新処理を実質的に停止させます。またゲーム再挑戦用のボタンを表示させます。

爆発のエフェクトを描画する処理を示します。敵を倒したときの火球と自機が被弾したときの火球に色の違いをつけて視覚的にわかりやすくします。火球の色はFireballクラスのコンストラクタに渡す第三引数が0か1かで変わります。

敵弾発射の処理

敵に弾丸を発射させる処理を示します。更新処理がおこなわれるごとに0.5%の確率で弾丸を発射させます。弾丸は自機がいる方向にむけて発射されます。

敵の生成

新しい敵を生成する処理を示します。

生成する敵のタイプと、EnemyXクラスのコンストラクタに渡す第一引数を乱数で決定しています。これによって8機で構成される敵の編隊が生成されます。

描画処理

描画の処理を示します。canvas全体をbackColorで塗りつぶし、各オブジェクトのDraw関数を呼び出して描画処理をおこないます。そのあとスコア関連の描画をおこないます。

スコア関連の描画をおこなう処理を示します。canvas上部にスコアとLifeを描画します。