動作確認はこちらからどうぞ。

Sキーでゲームスタート、← →キーで移動、スペースキーでミサイル発射です。

レーダースコープをJavaScript/TypeScriptで作成してきましたが、今回は完成させます。

自機を生成する
敵を生成する

Explosionクラス

まず爆発の描画をするExplosionクラスを作成します。

爆発の初期化

プロパティとコンストラクタを示します。マテリアルは6種類、生成後の時間経過とともに使用するものを変えます。GetMaterial関数はこれまでに作成したクラスと同じものです(だったら継承すれば?とも思うが・・・)。

爆発の移動

移動に関するプロパティと関数を示します。MoveCountが24になったら消滅させます。そのため爆発が表示されるのは0.5秒未満です。

爆発の追加と削除

爆発をシーンと配列に追加する関数を示します。

爆発をシーンと配列から取り除く関数を示します。

爆発を発生させる関数を示します。爆発の火花?に初速を与えて中心から広がるように移動させます。

その他の関数

次にクラスには所属しない関数を作成します。

フィールドを生成する

まずフィールドを生成する関数を示します。レーダースコープの縦横の直線を描画する処理をおこないます。

自機の移動と弾丸の発射

次に自機を移動させたり弾丸を発射する関数を示します。

移動は自機が画面の端よりも向こう側に移動して消えてしまわないように、移動の制限を加えます。弾丸発射の処理はJikiBurretオブジェクトを生成して、JikiBurret.Add関数でシーンに追加します。また発射時に音を鳴らし、連射はできないようにします。

当たり判定

当たり判定の処理をおこなう関数を作成します。

最初に自機からの弾丸が敵に命中したかどうかの判定をする関数を示します。

まずEnemy.Enemiesのなかから弾丸に命中した敵を取得します。敵を爆発させて敵の状態(待機中、攻撃中、退却中)に応じて点数を加算します。EnemyStatusをDeadにすると次にEnemy.Move関数が実行されたときにシーンから取り除かれます。処理をしたら最後に敵が全滅しているかどうかを調べます。

機雷に対しても同様の処理をおこないます。

敵が全滅したかどうかを調べる関数を示します。全滅しているときは3秒後にOnClear関数を実行します。OnClearでは敵が初期化されるとともに機雷によるダメージからも回復します。

自機死亡時の処理

次に自機が敵弾に当たっていないかを判定する処理を示します。各敵弾、機雷との距離と半径の合計を比較します。当たり判定とされた場合はOnJikiDead関数を呼びます。

自機が死亡した場合はjiki.IsDead = trueとすることで自機の描画を中断します。爆発音を鳴らすとともに残機を1減らします。残機が0になったらゲームオーバーです。

ゲームオーバーでない場合は4秒後に自機が復活してゲームが再開されますが、立て続けにやられないように自機死亡時は敵をいったん退却させます。そして自機が復活するまで新たに敵が攻撃をしかけてこないようにします。これに関してはEnemy.MoveAll関数でおこなわれます。

自機が爆発するときに背景を光らせる処理をする関数を示します。0.05秒間隔でChangeBackColor関数が呼び出され、背景の色が変わります(色は2種類)。合計で40回呼び出されるとclearInterval関数を呼び出して処理を止めます。

自機死亡後に自機を復活させる処理をする関数を示します。ここでは自機をふたたび描画されるようにするとともに自機のX座標を0にして、敵弾と機雷をシーンから取り除いてゲームを再開します。またダメージが32になって自機が死亡した場合はダメージをリセットします。

スコア表示

スコアを描画するための関数を示します。テキストフィールドに点数と残機を表示させます。

ちなみにHTMLはこのようになっています。スコア、残機表示、ダメージメーター、ゲームオーバー時に表示される2種類の文字列を設定できるようになっています。

ダメージメーターの表示

ダメージメーターを表示させるための関数を示します。DAMAGE METERの文字と合計32個の背景が赤または緑の矩形が表示されます。

ゲームオーバー表示

ゲームオーバーのときにはゲームオーバー表示をする関数を示します。

ゲームの初期化とリトライ

ゲームの初期化とリトライをするための関数を示します。ゲームの初期化は敵の編隊を初期化するだけです。リトライをする処理はupdateCount、score、damageのリセット、残機をゲーム開始時の状態に戻す、敵の弾丸、機雷をクリアする、自機のX座標を0にセットして描画されるようにする・・・などです。

キー操作への対応

キーが押されたときの処理をする関数を示します。左右の方向キーがおされたらグローバル変数のleft、rightをtrueにして離されたらfalseにします。スペースキーで弾丸発射、Sキーはリトライです。

更新処理

データを更新する関数を示します。この関数は1秒間に60回実行されます。

最後に

上記を組み合わせてゲームを完成させます。

動作確認はこちらからどうぞ。