弾の発生

通常弾、レーザー、ミサイルの生成処理について。
このゲームでは、登場するキャラクターをオブジェクト管理テーブル(2次元配列)で管理しています。
ID=0は母艦、1〜32は僚艦、33〜65は敵艦、66〜98は敵ミサイル、99不使用、100以上は攻撃オブジェクトに割り当てており、IDが99未満の「艦艇オブジェクト」については、共通のコードで弾の発生を処理しています。


フレーム毎に射撃インターバルカウンタが0かどうかチェックし、0になっていれば、以下のような流れで、攻撃オブジェクト(通常弾/レーザー)もしくはミサイルを生成します。(ミサイルは管理の都合上、艦艇扱い)。

1 ロックオン中の攻撃対象がない(ターゲットID=0)の場合は、対象範囲からランダムにIDを選択し、仮ロックオン。
  ロックオンしている攻撃対象の情報を取得。
2-A ミサイル艦の場合
  ターゲット(ミサイル)が不在(状態値=0)で、自身が特攻前なら、ミサイル発射処理を実施
   射撃インターバルを再設定(固定値)。
   該当のIDにミサイル用のパラメータを格納(ミサイル耐久値は、ゲーム進行により増加)。
   ロックオンは不要なので、攻撃対象をなしにする。
2-B ミサイル艦以外
  攻撃対象の座標を取得し、自身からの距離を計算
  「攻撃対象が健在、射程圏内、弾に空きがある」の全てについて成立するかチェック。
  成立する場合、攻撃オブジェクトの生成を実施
    射撃インターバルを再設定(カウンタ値は、ゲーム進行により減少)。
    弾の空きリストから1件取り出して攻撃オブジェクトとしての各種パラメータを格納。
  成立しない場合は、自身のロックオン中の攻撃対象をなしにする。

一度ターゲットIDが決まったら条件から外れるまで保持するので、射程圏内に入った攻撃対象をロックオンするようになります。
(ターゲットを撃破するか射程圏外になるまで撃ち続ける)


ランダムに選択するIDの範囲は、艦艇の種類ごとに以下のように割り振っています。

艦艇オブジェクトの種類 選択するIDの乱数範囲
プレイヤー母艦、プレイヤー僚艦(通常弾) 33〜65:敵艦
プレイヤー僚艦(レーザー) 66〜98:敵ミサイル
敵艦通常弾 0〜32:プレイヤー側全体
敵レーザー艦 0固定:常にプレイヤー母艦
敵ミサイル艦 66〜98:敵ミサイル(生成対象として)
敵ミサイル 99〜132(この範囲は常に状態値=0なので弾を撃たない)


母艦を示すID=0は、この処理ではロックオンなしの意味でもあります。
そのため、敵の通常弾攻撃は母艦に対しては消極的で、側に僚艦がいるとそちらをロックオンするようになります。
逆に敵レーザー艦では、攻撃対象をID=0固定とするので、常に母艦をロックオン(発射は距離次第)します。
また、ミサイル艦の場合は、求めたIDは新たに生成するミサイルのオブジェクトIDとして使用しますので、空きオブジェクトのIDを掴めないとそのフレームでの発射はなし、次フレームでの再試行に回されます。


通常弾とレーザーを生成する場合、弾の空きリストからオブジェクトIDを持ってくることによって、ほぼ切れ目なく、等間隔連射が可能になっています。
この弾の空きリストは、1次元配列と、リスト件数で管理しています。
フレーム毎にリスト件数をクリアし、通常弾とレーザーの描画や衝突判定など処理するループの中で、移動カウンタが0のオブジェクトについて空きリスト前方から順に追記。
(リスト件数が示す配列要素に該当IDを記録し、リスト件数を1加算)
次フレームの弾発生処理にて、リスト件数で示されている場所から順次遡って使用(リスト件数を減算しつつ、示されるIDを利用)します。