Skip to content
第31回 出撃コストと再出撃待ち時間

2 / 2 出撃条件と消費 ​

このステップの目的

条件を満たしたときだけ生成し、成功後に資源と待ち時間を更新します。

条件を確認する順序 ​

Battle.cppのBattle::TryDeployを置き換えます。戦闘中か、候補が存在するか、待ち時間が終わったか、資源が足りるか、戦場へ生成できたかを順に調べます。失敗時は理由をreasonへ入れてfalseを返してください。

data_.roster[slot]のIDから定義を探し、共通のSpawnUnitへ渡します。成功してからコストを引き、cooldowns_[slot]へ定義の待ち時間を設定します。戦場が満員だった場合に、先に資源を消費してはいけません。

操作と比較 ​

ビルド後、軽装兵を連続で出撃し、資源と待ち時間のどちらが制限になったかを説明します。重装兵はコスト85、待ち時間4秒です。軽装兵と比べ、同じ時間内に何体出せるかを観察してください。

Roster.csvの順番を変更し、種類の性能を変えずに候補の表示順と数字キーが変わることを確認します。確認後は元の順番へ戻します。資源と待ち時間はリトライで初期値へ戻ることも確かめます。

実装後に比較する参考コード
Source/TowerDefense/Battle.cppcpp
bool Battle::TryDeploy(std::size_t slot, std::string& reason)
{
    reason.clear();
    if (result_ != Result::Playing) { reason = "戦闘が終了しています"; return false; }
    if (slot >= data_.roster.size()) { reason = "その出撃候補はありません"; return false; }
    const int definition = data_.FindUnit(data_.roster[slot]);
    const auto& type = data_.units.at(definition);
    if (cooldowns_[slot] > 0) { reason = "再出撃まで待ってください"; return false; }
    if (resource_ < type.spawnCost) { reason = "資源が足りません"; return false; }
    if (!SpawnUnit(definition, Team::Ally)) { reason = "戦場の上限128体に達しています"; return false; }
    resource_ -= type.spawnCost;
    cooldowns_[slot] = type.spawnCooldownSec;
    return true;
}
チェックリスト

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

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