Appearance
第18回 重力、ジャンプ、着地
第17回では、水平方向(X軸)の加速度と摩擦による移動を実装しました。
第18回では、垂直方向(Y軸)の挙動として、重力・ジャンプ・床への着地処理を実装します。
下向きにかかり続ける重力加速度によってプレイヤーを落下させ、足元の床ブロックを検知してめり込まずに着地(位置補正)させます。また、接地中のみジャンプ入力を受け付け、空中での連続ジャンプを防止する接地判定(onGround_)を構築します。
配布プロジェクト
第18回の開始用プロジェクトを展開し、PlatformerGame2D.sln を Visual Studio 2026 で開いてください。
第17回までの水平移動と端数処理が実装された状態から開始します。
配布ファイル一覧
| ファイル | 役割 |
|---|---|
Source/Platformer/Player.h / Player.cpp | 垂直速度(velocity_.y)、重力適用、床衝突補正、ジャンプ |
Source/Platformer/Tuning/GameTuning.h | 重力加速度、ジャンプ初速、最大落下速度の調整値 |
Source/Platformer/Stage.cpp | 床タイルとの重なり検出と位置補正(ResolveVertical) |
この回のゴール
プレイヤーが重力に従って落下し、ステージの床タイルの上にめり込まずに着地する状態を実装します。
接地中に Z キーを押すとジャンプし、放物線を描いて上昇から落下へ切り替わり、再び床へ着地できることを確認します。
- 画面座標系におけるY軸(下向きが正)と、ジャンプ初速(負値)・重力(正値)の関係を理解する
- 重力加速度を毎フレーム加算し、最大落下速度(
MaxFallSpeed)でクランプできる - 落下後に床タイルの上端へプレイヤーの足元を一致させる位置補正を実装できる
- 接地フラグ
onGround_を毎フレーム更新し、空中での多段ジャンプを防止できる - 「接地している状態(状態)」と「着地した瞬間(イベント)」を区別できる
今回のポイント
画面座標系における垂直方向の符号
画面座標系では、一般的な数学の座標系とは異なり**「下方向が +Y、上方向が -Y」**となります。
垂直運動の符号ルールtext
ジャンプ初速(JumpPower) : 上方向への移動速度のため「負の値」(例: -620.0f)
重力加速度(FallGravity) : 下方向へ加速するため「正の値」(例: +1600.0f)ジャンプ直後は負の垂直速度を持ちますが、毎フレーム正の重力加速度が加算されることで速度が徐々に正へ変化し、放物線運動となります。
cpp
velocity_.y += tuning::player::FallGravity * deltaTime;
velocity_.y = std::min(velocity_.y, tuning::player::MaxFallSpeed);作業の準備
開始用ZIPには前回までの到達状態が含まれています。今回の新規ファイルは、本文を進めながら追加します。ファイルの登録方法や変更の引き継ぎ手順は、配布ファイルの手順で確認できます。
| 作業 | 対象 |
|---|---|
| 新規作成 | なし |
| 既存ファイルへ追記・編集 | 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 |
| 重点的に実装・確認する処理 | Player::UpdateInput、Player::UpdatePhysics、Stage::ResolveVertical |
ヘッダーの宣言、#include、登録テーブル、エラー処理などは、最終ステップの参考実装を参照できます。重点関数は各ステップで処理の流れを確認しながら記述します。関数を変更する際は、宣言・定義・呼び出し元の整合性を保ちます。
GameTuning.h には今回必要な定数を追記し、自身で調整した既存の値を維持します。
第18回の目次
1 / 4重力で落下させるY方向の速度と端数を使い、落下する移動を作ります。2 / 4床へ着地する位置を求める
Stage で床の位置を調べ、Player の足元を床の上端へ合わせます。3 / 4接地中にジャンプする前の接地状態で入力を判定し、移動後の足元で接地状態を更新します。4 / 4着地した瞬間を通知する接地状態の変化から着地イベントを作り、ジャンプと着地を確認します。動作確認
- 接地中のみジャンプを開始できる
- 上昇、頂点、落下、着地の順に垂直速度が変化する
- 床タイルの上端で正確に停止し、めり込まない
- 最大落下速度を超えない
次回は、この考え方を壁と天井へも拡張し、軸分離による安定した衝突解決を整理します。