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

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

前回は自機を生成しましたが、今回は敵を生成します。

EnemyStatus列挙体

敵の状態は待機中、攻撃中、退却中、死亡の4つのどれかにあります。EnemyStatus列挙体で敵の状態を管理します。

Enemyクラス

プロパティを示します。敵は縦に5列、横に9列で配置されます。待機中の敵のうち前2列を前後に移動させるので、それが何列目なのかわかるようにしています。攻撃に参加してそのまま上空に退却した敵は編隊の最後尾に再配置されます。これによって何列目に配置されているかが変更されます。

敵が弾丸を発射するタイミング、機雷を投下するタイミングは攻撃に参加してからの時間で決まるのでMove関数を実行した回数を記憶させています。弾丸のうち3回目に発射するものは斜めに発射するため、何回弾丸を発射したかも記憶させています。

敵の初期化

コンストラクタを示します。マテリアルは一度取得すれば使い回すことができるので静的変数にしています。あとはJikiクラスとほとんど同じです。

マテリアルを取得する関数を示します。Jikiクラスと同じです。

敵全体を初期化する関数を示します。現在存在する敵をシーンからすべて取り除き、配列も空にします。新たにEnemy.RowMax行、Enemy.ColumMax列の敵を生成して初期座標を与え、シーンに追加します。

敵の移動

移動に関するプロパティを示します。XとZに値を入れると描画位置が変更されるようにしています。

敵を移動させる関数を示します。最初に死んだ敵をシーンと配列のなかから取り除きます。updateCountの値で描画に使うスプライトを変更し、攻撃中であったり退却中である敵を移動させます。待機中の敵の移動や攻撃に参加させる処理は別の静的関数でおこないます。

攻撃中の敵を移動させる関数を示します。MoveDownCountが20の倍数であるときは弾丸を発射し、3発目は斜めに発射します。EnemyBurretクラスは後述します。EnemyBurretオブジェクトを生成して敵の弾丸が描画されるようにします。Z座標が15になるまで下降したら退却します。

退却中の敵を移動する処理を示します。退却時にときどき機雷を投下させます。機雷を投下するか判断するのは1秒間に1回です。実際に投下されるのは、X座標の絶対値が15より小さく(そうでないと自機で機雷を撃墜できない)、Z座標が-10以上である場合である場合で、確率は50%です。

Z座標が-30よりも上まで退却したら、EnemyStatusをEnemyStatus.Standbyに変更し、編隊の後部に再配置します。

退却した敵を編隊の最後尾に再配置する関数を示します。現在編隊上に存在する敵のLineの値のなかから最大値を求めます。これが最後尾の列番号です。最後尾の列に空きがあればそこへ配置させ、ない場合はその後ろの列に配置されます。

Lineの最大値と最小値を求める関数を示します。

待機中の敵を攻撃に参加させる関数を示します。updateCountが40の倍数のときに攻撃に参加させる敵を適当に選び、攻撃に参加した敵がいた場合は編隊全体を前進させます。

待機中の敵のうち前2列を前後に移動させる関数を示します。全体を1秒間下に移動、そのあと上に移動させるのでupdateCountが120の倍数のときに敵は一番上にきていることになります。このタイミングで最前列の敵のLineの最小値を取得し、保存しておきます。

最前列の敵のLineの最小値を更新する処理は前2列が一番上にきているタイミングでおこないます。任意のタイミングでおこなうと次の列以降にいる敵がへんなタイミングで「前2列」と認識されてしまい、編隊の形が崩れてしまいます。

敵全体を移動させる関数を示します。

新たに敵を攻撃に参加させる必要があるならEnemyBeginAttack関数で処理をします。待機中の敵で必要なものは移動させ、攻撃中または退却中の敵がいるならMove関数で移動させます。ただし自機死亡時は新たに攻撃に参加するのをやめます。

当たり判定

当たり判定の関数を示します。自機の弾丸が命中したら弾丸をDeadにしてtrueを返します。判定法は互いを球とみなして半径の和よりも距離が近ければ当たっているとしています。

EnemyBurretクラス

敵の弾丸を管理するためのEnemyBurretクラスを作成します。

弾丸の生成

プロパティとコンストラクタを示します。敵の弾丸は直線で描画します。

弾丸の移動

弾丸を移動させるプロパティと関数を示します。Z座標が20より大きいものはDead関数でシーンと配列から取り除きます。

追加と削除

新しい弾丸をシーンと配列に追加する関数を示します。

すべての弾丸をシーンと配列から取り除く関数を示します。

すべての弾丸を移動させる関数を示します。

Mineクラス

機雷を描画するためのクラスを作成します。

機雷の初期化

最初にプロパティとコンストラクタを示します。コンストラクタはEnemyクラスとほぼ同じです。GetMaterial関数も同じです。

機雷の移動

移動に関するプロパティと関数を示します。

Z座標が21より大きくなると着弾したことになり、ダメージ1(自機死亡とは別概念)となります。

機雷の着弾

機雷着弾時の処理をする関数を示します。着弾したらダメージ1とし、ダメージが蓄積されて32以上になったら自機死亡とします。実際のレーダースコープではダメージがいっぱいになると「動作が遅くなる」そうですが、実際にどうなるのかは見たことがありません。

またゲームオーバー時は敵が攻撃と機雷投下を行ないますが、着弾時の処理はしないことにします。

機雷の当たり判定

当たり判定処理をする関数と死んだ機雷をシーンから取り除く関数を示します。

機雷の追加と削除

生成した機雷をシーンに追加する関数とすべての機雷をシーンから取り除く関数を示します。