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