Skip to content
第32回 定義に基づくウェーブ

1 / 2 ウェーブから出現予定を作る ​

このステップの目的

種類、数、時刻、間隔から共通の出現予定を作ります。

第32回の到達版で、戦闘開始5秒後から敵が出る様子を観察します。ウェーブの行を移動しても、早い時刻の敵から出現します。

出現時刻の計算 ​

ウェーブは「1行で1種類の敵の出現列」です。5秒から2秒間隔で5体なら、時刻は5、7、9、11、13秒です。出現番号は0から始めます。

Battle.cppのBattle::BuildScheduleを実装します。各ウェーブのunitIdから定義を探し、count回のループでSpawnEventを追加します。時刻はstartTimeSec + i * spawnIntervalSecです。最後にstd::stable_sortで時刻順へ並べ、同時刻は元の行の順を保ちます。

予定の作成はBattleの構築時に呼ぶ接続を用意しています。リトライでは予定を消さず、読み取り位置nextEvent_と時計を0へ戻します。

確認用の敵を取り除く ​

Battle::Resetの末尾にあるSpawnUnit(data_.FindUnit("scout"), Team::Enemy);と確認用コメントを取り除きます。敵は次のステップから予定に従って生成します。

まだ予定を読み取る処理が空欄のため、この段階では敵が出ません。次のステップを接続してから出現時刻を確認してください。

実装後に比較する参考コード
Source/TowerDefense/Battle.cppcpp
void Battle::BuildSchedule()
{
    events_.clear();
    for (const auto& wave : data_.waves)
    {
        const int definition = data_.FindUnit(wave.unitId);
        if (definition < 0) throw std::invalid_argument("未登録のウェーブunit_id");
        for (int i = 0; i < wave.count; ++i)
            events_.push_back({ wave.startTimeSec + i * wave.spawnIntervalSec,
                definition, wave.id });
    }
    std::stable_sort(events_.begin(), events_.end(),
        [](const SpawnEvent& a, const SpawnEvent& b) { return a.timeSec < b.timeSec; });
}
チェックリスト

今回の変更箇所を指し示し、観察した結果とその理由を説明できますか。実験後の値とファイルを確認して次へ進みます。

ゲームプログラミング実践