Skip to content

第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.cppSource/Platformer/Game.hSource/Platformer/Player.cppSource/Platformer/Player.hSource/Platformer/Stage.cppSource/Platformer/Stage.hSource/Platformer/Tuning/GameTuning.h
重点的に実装・確認する処理Player::UpdateInputPlayer::UpdatePhysicsStage::ResolveVertical

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

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

第18回の目次

動作確認

  • 接地中のみジャンプを開始できる
  • 上昇、頂点、落下、着地の順に垂直速度が変化する
  • 床タイルの上端で正確に停止し、めり込まない
  • 最大落下速度を超えない

次回は、この考え方を壁と天井へも拡張し、軸分離による安定した衝突解決を整理します。

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