Skip to content
第03回 敵の出現と移動

3 / 4 敵の移動方法を追加する

このステップの目的

敵の共通する下方向の進行を保ったまま、直進と波状移動を実装する

直進する敵

敵の中心座標をpositionへ保持し、毎フレームY座標を増やします。 速度は1秒あたりの移動量として設定し、deltaTimeを掛けてフレームごとの移動量へ変換します。 std::sin()を使うための標準ライブラリのincludeは、開始用コードへ用意しておきます。

Enemy.cppcpp
if (!isActive)
    return;

position.y += moveSpeed * deltaTime;

敵の下端が画面の下へ出たらDeactivate()を呼びます。 削除するのではなく停止することで、Managerの空き要素として再利用できます。

Enemy.cppcpp
if (GetHitbox().y > tuning::ScreenHeight)
    Deactivate();

波状移動を追加する

波状移動では、出現時のX座標をbaseXへ保存し、経過時間ageから横方向の位置を計算します。 Y方向の進行は直進する敵と同じです。

Enemy.cppcpp
age += deltaTime;
position.y += moveSpeed * deltaTime;
position.x = baseX + std::sin(age * tuning::enemy::WaveSpeed)
    * tuning::enemy::WaveAmplitude;

移動方法はBehaviourで保持します。 Gameは波の計算をせず、敵へ更新を依頼するだけにします。

出現する敵に変化をつけるため、spawnIndexから速度と移動方法を順番に選びます。 第02ステップで書いたSpawnOne()の、enemy.Spawn()を呼ぶ部分を次の形へ置き換えます。

EnemyManager.cppcpp
int speedLevel = spawnIndex % tuning::enemy::SpeedLevels;
float speed = tuning::enemy::BaseSpeed
    + speedLevel * tuning::enemy::SpeedStep;

Enemy::Behaviour pattern =
    (spawnIndex + 1) % tuning::enemy::WaveInterval == 0
        ? Enemy::Behaviour::Wave
        : Enemy::Behaviour::Straight;

enemy.Spawn(startPosition, speed, pattern);
++spawnIndex;

これで、基本速度の敵に加えて少し速い敵が順番に現れ、一定間隔で波状移動も現れます。

チェックリスト
  • 直進する敵が下方向へ進む
  • 波状の敵が下方向へ進みながら左右へ揺れる
  • 敵が画面外へ出ると停止する