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

2 / 2 時計による敵の出現 ​

このステップの目的

戦闘時計が予定時刻へ達したら、敵を共通の生成処理へ渡します。

予定を読み取る ​

Battle.cppのBattle::UpdateWavesを実装します。nextEvent_が予定数未満で、予定の時刻がtimeSec_以下なら、予定の定義とTeam::EnemyをSpawnUnitへ渡します。成功したときだけ読み取り位置を進めます。

予定が同じ時刻のときや更新の間に複数の時刻を越えたときは、whileで処理します。戦場が128体で生成できない場合は、理由を表示して今回の処理を終えます。予定を進めずに残すので、空きができた更新で再試行できます。

ウェーブを変更する ​

Waves.csvの最初の行を、開始3秒、3体、間隔1秒へ変更してください。敵が3、4、5秒に出ると予想してから、保存して起動し直します。Pで一時停止して数秒待ち、再開直後に敵がまとめて増えないことを確認します。

別の行のunit_idをguardへ変え、同じ出現処理で高耐久・低速の敵になることを観察します。敵が一時的に0体でも将来の予定が続き、最後の敵を出しただけでは勝利しないことも確認してください。

実験後は元の開始時刻、数、間隔へ戻します。自分のステージとして残す場合は、変更意図と予想した有効な味方を記録します。

実装後に比較する参考コード
Source/TowerDefense/Battle.cppcpp
void Battle::UpdateWaves()
{
    notice_.clear();
    while (nextEvent_ < events_.size() && events_[nextEvent_].timeSec <= timeSec_ + 1e-9)
    {
        const auto& event = events_[nextEvent_];
        if (!SpawnUnit(event.definition, Team::Enemy))
        {
            notice_ = "戦場が128体のため敵の出現を待機中です";
            return; // 予定を消さず、空きができた更新で再試行する。
        }
        currentWave_ = event.waveId;
        ++nextEvent_;
    }
}
チェックリスト

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

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