Skip to content

第22回 敵の物理と巡回状態

第21回では、敵キャラクターの配置読み込みと一括管理システムを構築しました。
第22回では、敵キャラクターに重力・地形衝突判定・巡回移動(壁での反転・足場の端の検知)・撃破状態を実装します。

配布プロジェクト

第22回の開始用プロジェクトを展開し、PlatformerGame2D.sln を Visual Studio 2026 で開いてください。
第21回で構築した敵配置読み込みと入力アシスト機能が含まれたプロジェクトから開始します。

配布ファイル一覧
ファイル役割
Source/Platformer/Enemy.h / Enemy.cpp敵の重力・移動・壁衝突反転・足場端検知・撃破処理
Source/Platformer/EnemyManager.h / EnemyManager.cpp敵の一括更新・描画・リセット
Source/Platformer/Tuning/GameTuning.h敵の移動速度・重力等の調整値

この回のゴール

敵キャラクターが重力に従って床に着地し、壁や足場の端で反転しながら足場上を往復巡回する挙動を実装します。また、撃破された敵を EnemyState::Defeated 状態へと遷移させ、更新・描画から除外します。

  • 敵キャラクターに重力と地形衝突を適用し、床タイルへ正しく着地させることができる
  • 進行方向の壁に接触した際、移動方向を反転させて壁押しを回避できる
  • 進行方向の足元タイルを先読み検知し、足場から落下する前に反転して往復巡回できる
  • 撃破された敵を EnemyState::Defeated 状態へ遷移させ、更新・描画・判定から除外できる

今回のポイント

1. 物理モデルの共通化と責務の独立

敵キャラクターはプレイヤーのようなキー入力は受け付けませんが、位置・速度・移動端数(Remainder)・当たり判定矩形(Hitbox)という物理の基本要素はプレイヤーと共通です。共通の基底クラスを作らず各クラスで自己完結させることで、依存関係の少ない保守しやすい設計とします。

2. 敵の状態遷移(Patrol と Defeated)

敵キャラクターの状態は、巡回中を表す Patrol と、撃破された Defeated の2状態で管理します。

図を準備しています…

3. 足元先読みセンサーによる落下防止

敵が足場から落下して画面外へ消えないよう、当たり判定の前方足元にセンサー領域を設定します。1歩進む前に進行方向の床タイルの有無を確認することで、足場の端で方向転換し、足場上を往復巡回させます。

作業の準備

開始用ZIPは前回までの到達状態です。今回の新規ファイルはありません。ファイルの登録方法と自分の変更の引き継ぎは、配布ファイルの手順で確認できます。

作業対象
新規作成なし
既存ファイルへ追記・編集Source/Platformer/Enemy.cppSource/Platformer/Enemy.hSource/Platformer/EnemyManager.cppSource/Platformer/EnemyManager.hSource/Platformer/Game.cppSource/Platformer/Tuning/GameTuning.h
重点的に実装・確認する処理Enemy::Update()

ヘッダーの宣言、include、登録表、読み込みのエラー処理は、最終ステップの参考実装を必要に応じて利用します。重点関数は各ステップで処理の理由を確かめながら記述します。関数を変更するときは、宣言・定義・呼び出し元の整合性を保ちます。

必要に応じて GameTuning.h に定数を追加し、敵の移動速度や重力を調整します。

第22回の目次

動作確認

  • 生成された敵が重力に従って床タイルへ着地すること
  • 壁に接触した際に進行方向を反転すること
  • 足場の切れ端に達した敵が落下せずに手前で方向転換すること
  • Defeat() が呼ばれた敵が更新・描画の対象から除外されること

次回は、トゲや敵との接触判定、穴への落下によるミス処理、タイトル・結果画面を追加してゲームループを完成させます。

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