Skip to content

第03回 敵の出現と移動 ​

第02回では、プレイヤー弾を使って個体クラスと管理クラス(Manager)の分け方、オブジェクトプールの基本を学びました。
第03回では同じ管理方法を使い、画面上端から次々に現れる敵と、その管理クラスを実装します。

敵には、下へ直進する動きと、三角関数で左右に揺れながら進む波状移動の2種類を用意します。異なる動きでゲーム展開に変化をつけます。

始める前に ​

複数の個体を更新するループと、速度から座標を変える処理を確認してください。確認したい場合は、オブジェクトプールを参照してください。

前の回の受講や完成物は必須ではありません。下の開始用プロジェクトを使い、配布済みの処理と今回追加する処理を確認してから進めます。

配布プロジェクト ​

第03回のプロジェクトを展開し、ShootingGame2D.slnをVisual Studio 2026で開いてください。
第02回で実装した自機の移動と弾の連射機能が含まれたプロジェクトから開始します。

配布ファイル一覧
ファイル役割
Source/Shooting/Game.cppゲームループと各Managerの呼び出し
Source/Shooting/PlayerShot.hプレイヤー弾単体の定義
Source/Shooting/PlayerShotManager.hプレイヤー弾Managerの定義
Source/Shooting/PlayerShotManager.cpp第02回で完成させた弾の管理処理
Assets/Images/Enemy.png敵キャラクターの画像素材

この回のゴール ​

画面上端の各レーンから敵が一定周期で自動的に出現し、画面下部へ向かって進行する状態を作ります。

第03回の完成イメージ第03回の完成イメージ

  • 敵1体分のデータと振る舞いをEnemyクラスとして定義できる
  • 同じEnemyクラスの中で「直進移動」と「波状移動」の2種類の挙動を切り替えて制御できる
  • 複数の敵をプールとして統括するEnemyManagerを実装できる
  • 出現タイマーとレーン分割の仕組みを用いて、規則的かつ変化のある敵の出現を実現できる

今回のポイント ​

PlayerShotManagerと、今回作るEnemyManagerは同じ設計です。多数のオブジェクトを固定配列に持ち、空きを探して再利用します。

Managerによる一括管理の再利用
Game
毎フレームのUpdateとDrawを依頼
EnemyManager
EnemyManager
出現タイマーに応じて停止中スロットを初期化(Spawn)
Enemy
EnemyManager
有効な敵すべての移動(Update)を実行
Enemy
EnemyManager
敵画像を描画
ImageManager

同様の管理構造を敵やエフェクトなどの他のオブジェクトへ展開することで、プログラム全体で一貫した設計を保ちやすくなります。

敵の種類ごとにクラスを分けず、Enemy::Behaviour列挙型で一つのクラス内の移動パターンを切り替えます。コードが大きくなりすぎるのを抑えながら、動きの種類を増やす方法を学びます。

作業の準備 ​

開始用ZIPには前回までの到達状態が含まれています。今回の新規ファイルは、本文を進めながら追加します。ファイルの登録方法や変更の引き継ぎ手順は、配布ファイルの手順で確認できます。

作業対象
新規作成Source/Shooting/Enemy.cpp、Source/Shooting/Enemy.h、Source/Shooting/EnemyManager.cpp、Source/Shooting/EnemyManager.h
既存ファイルへ追記・編集Source/DxGame/Rect.h、Source/Shooting/Game.cpp、Source/Shooting/Game.h、Source/Shooting/ImageManager.cpp、Source/Shooting/ImageManager.h、Source/Shooting/PlayerShot.h、Source/Shooting/Tuning/GameTuning.h
重点的に実装・確認する処理Enemy::Update、EnemyManager::Update

ヘッダーの宣言、#include、登録テーブル、エラー処理などは、最終ステップの参考実装を参照できます。重点関数は各ステップで処理の流れを確認しながら記述します。関数を変更する際は、宣言・定義・呼び出し元の整合性を保ちます。

GameTuning.hには今回必要な定数を追記し、自身で調整した既存の値を維持します。

第03回の目次 ​