Appearance
第21回 敵の配置とジャンプ操作の改善
第20回では、プレイヤーのアニメーションと効果音再生を実装しました。
第21回では、ステージCSVからの敵出現位置読み込みと一括管理システム(EnemyManager)を構築し、ジャンプ操作の応答性を高める「可変ジャンプ」および「入力アシスト(コヨーテタイム・先行入力バッファ)」を実装します。
配布プロジェクト
第21回の開始用プロジェクトを展開し、PlatformerGame2D.sln を Visual Studio 2026 で開いてください。
第20回のアニメーションと音声イベントが完成した状態から開始します。
配布ファイル一覧
| ファイル | 役割 |
|---|---|
Source/Platformer/Stage.cpp | CSV読み込み時の敵出現セル(90)の抽出と空セル化 |
Source/Platformer/Player.cpp | 可変ジャンプ制御、コヨーテタイム、先行入力バッファ |
まず敵の配置と描画を確認します。可変ジャンプと入力補助は、配置が動いた後に参考実装を利用し、値を変えて感触を比較します。
この回のゴール
ステージCSVで指定した位置へ敵キャラクターを配置し、リセット時に初期配置へ戻せるようにします。また、ボタンの押し時間に応じた可変ジャンプと入力アシストを導入し、意図したタイミングでジャンプが成立する操作感を実現します。
- ステージCSVから敵出現位置(値
90)を読み取り、地形判定と分離して管理できる - CSVの配置数に合わせて
std::vectorへ敵を格納できる - ボタンを押す長さに応じてジャンプの高さが変わる可変ジャンプを実装できる
- 足場を離れた直後のコヨーテタイムと、着地直前の先行入力バッファの仕組みを理解・実装できる
今回のポイント
1. 敵の配置データと地形配列の分離
ステージCSVにおいて、整数値 90 を敵の出現位置(StageCell::EnemySpawn)として定義します。読み込み時にタイルの中心座標をワールド座標へ変換して出現位置リストへ登録し、地形セル自体は空白(Empty)として保持します。これにより、敵が移動したり倒されたりしても地形の当たり判定に影響を与えません。
2. 配置数に合わせた敵の管理
単体の敵の挙動を表現する Enemy クラスと、その集合を管理する EnemyManager クラスに責務を分離します。EnemyManager は std::vector を持ち、ステージ開始時にCSVの配置数に合わせて初期化します。この回では敵の配置と描画を扱い、巡回は次回で追加します。
3. 操作感を向上させる3つのアシスト機能
アクションゲームにおいて、厳密なフレーム単位の判定とプレイヤーの入力感覚との間にはわずかなズレが生じます。この差を補正するために、以下の3つの機能を導入します。
| 操作改善機能 | 目的と仕組み |
|---|---|
| 可変ジャンプ | ジャンプ上昇中にボタンを離した際、垂直速度を減衰させて低いジャンプを可能にする |
| コヨーテタイム | 足場の端を踏み外した直後の数フレーム間、空中にいてもジャンプ入力を受け付ける |
| 先行入力バッファ | 着地の直前(数フレーム前)に入力されたジャンプキーを保持し、着地した瞬間にジャンプを発動させる |
作業の準備
開始用ZIPは前回までの到達状態です。今回の新規ファイルは、本文を進めながら追加します。ファイルの登録方法と自分の変更の引き継ぎは、配布ファイルの手順で確認できます。
| 作業 | 対象 |
|---|---|
| 新規作成 | Source/Platformer/Enemy.cpp、Source/Platformer/Enemy.h、Source/Platformer/EnemyManager.cpp、Source/Platformer/EnemyManager.h |
| 既存ファイルへ追記・編集 | Source/Platformer/Game.cpp、Source/Platformer/Game.h、Source/Platformer/Player.cpp、Source/Platformer/Player.h、Source/Platformer/Stage.cpp、Source/Platformer/Stage.h、Source/Platformer/Tuning/GameTuning.h |
| 重点的に実装・確認する処理 | EnemyManager::Reset()、Player::UpdateInput() |
ヘッダーの宣言、include、登録表、読み込みのエラー処理は、最終ステップの参考実装を必要に応じて利用します。重点関数は各ステップで処理の理由を確かめながら記述します。関数を変更するときは、宣言・定義・呼び出し元の整合性を保ちます。
必要に応じて GameTuning.h に定数を追加し、可変ジャンプなどの操作感を調整します。
第21回の目次
1 / 4ステージCSVからの敵出現位置の読み込みステージCSV内の敵配置セル(
90 / StageCell::EnemySpawn)をワールド座標へと変換して出現位置リストに記録し、地形データ配列上では空白セルとして保持する仕組みを実装します。2 / 4配置数に合わせて敵を管理するCSVの配置情報から敵を生成し、EnemyManager がまとめて描画します。3 / 4可変ジャンプの実装と速度減衰ジャンプ上昇中にボタンを離した瞬間に上向き速度を減衰させる「可変ジャンプ(カットオフ)」を実装し、ボタンを押す長さに応じて小ジャンプと大ジャンプを使い分けられるようにします。4 / 4コヨーテタイムと先行入力バッファ人間の知覚・操作感覚とフレーム単位の物理判定のズレを補正する「コヨーテタイム」と「先行入力バッファ」を導入し、意図したタイミングで確実にジャンプが成立する操作補助を実装します。動作確認
- CSVファイル内の
90で指定したすべての座標に敵キャラクターが表示されること - CSVに
90のセルを1つ追加すると、表示される敵が1体増えること - ステージリセット時にすべての敵が初期配置へ復元されること
- ジャンプボタンを短く押すと低く、押し続けると高くジャンプすること
- 足場を離れた直後や着地直前のジャンプ入力が適切に受け付けられること
次回は、敵キャラクターに重力・地形衝突判定・足場の端での方向転換処理を追加し、巡回移動処理を実装します。