弾の発生
通常弾、レーザー、ミサイルの生成処理について。
このゲームでは、登場するキャラクターをオブジェクト管理テーブル(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を利用)します。