Appearance
第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;これで、基本速度の敵に加えて少し速い敵が順番に現れ、一定間隔で波状移動も現れます。
チェックリスト
- 直進する敵が下方向へ進む
- 波状の敵が下方向へ進みながら左右へ揺れる
- 敵が画面外へ出ると停止する