Skip to content
第25回 個体の生成と共通の前進

1 / 2 個体の生成と初期値 ​

このステップの目的

同じ性能定義から、状態が独立した個体を生成します。

先行作品では自分でPlayerを動かしました。今回はプレイヤーが出撃を選び、生成したユニットが自動で前進します。まず第25回の到達版で1を2回押し、同じ外見の2体がそれぞれ進む様子を見てください。

定義を読む ​

Source/TowerDefense/Definitions.hのUnitDefinitionは、種類の最大HPや移動速度を持ちます。Battle.hのUnitInstanceは、その1体の現在HPと位置を持つ構造体です。構造体は関連する値をまとめる型です。今回は用意された型を使い、違いは第29回で詳しく比較します。

生成する関数 ​

Source/TowerDefense/Battle.cppのBattle::SpawnUnitを開き、return false;だけの仮の本体を置き換えます。定義の参照が有効か調べ、戦場が128体未満ならローカル変数UnitInstance unit;を作ってください。

definitionとteamを引数から渡し、hpへ定義のmaxHpをコピーします。味方の開始X座標は80、敵は880です。units_.push_back(unit)で戦場の一覧に追加し、成功をtrueで返します。初期値が定義された待ち時間は0のまま使います。

描画、入力、出撃キーからの呼び出しは提供済みです。移動関数は次のステップで作るため、ここでは1を押すと味方拠点に個体が表示されれば成功です。

値を変えて確かめる ​

2体生成し、片方の状態を変更してももう1体を変更しない理由を説明してください。今回は定義を共有し、現在状態を個体へコピーしています。確認後は独自の初期値を残さず、定義からHPをコピーする形に戻します。

実装後に比較する参考コード
Source/TowerDefense/Battle.cppcpp
bool Battle::SpawnUnit(int definition, Team team)
{
    if (definition < 0 || definition >= static_cast<int>(data_.units.size()))
        throw std::out_of_range("ユニット定義の参照が不正です");
    if (units_.size() >= tuning::MaxActiveUnits) return false;
    UnitInstance unit;
    unit.definition = definition;
    unit.team = team;
    unit.hp = data_.units[definition].maxHp;
    unit.x = team == Team::Ally ? tuning::AllyBaseX : tuning::EnemyBaseX;
    units_.push_back(unit);
    return true;
}
チェックリスト

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

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