Appearance
第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; });
}チェックリスト
今回の変更箇所を指し示し、観察した結果とその理由を説明できますか。実験後の値とファイルを確認して次へ進みます。