第17回 加速度、摩擦、移動の端数
第16回までは、キーを押すと即座に一定速度で進み、離すと停止する等速直線運動で移動していました。
第17回では、キー入力に応じた「加速度」と、床との「摩擦」による減速を導入し、滑らかな加減速運動を実装します。さらに、1フレームあたりの移動量が1ピクセル未満になる微小な移動を切り捨てずに保持する「端数蓄積(Remainder)」の仕組みを学びます。
始める前に
位置・速度・経過時間と、Playerの更新処理を確認してください。加速度と摩擦は数値例で説明します。確認したい場合は、調整できるプレイヤー表示と操作を参照してください。
前の回の受講や完成物は必須ではありません。下の開始用プロジェクトを使い、配布済みの処理と今回追加する処理を確認してから進めます。
配布プロジェクト
第17回の開始用プロジェクトを展開し、PlatformerGame2D.sln を Visual Studio 2026 で開いてください。
第16回で実装したワールド座標系とカメラ追従機能が組み込まれています。
配布ファイル一覧
| ファイル | 役割 |
|---|---|
Source/Platformer/Player.h / Player.cpp | 速度(velocity_)と移動端数(remainderX_)の追加 |
Source/Platformer/Tuning/GameTuning.h | 加速度、最高速度、摩擦係数の調整値 |
Source/Platformer/Game.cpp | デバッグ表示への速度情報出力 |
この回のゴール
キーを入力するとプレイヤーが徐々に最高速度まで加速し、キーを離すと摩擦によって減速して停止する運動モデルを完成させます。
また、GameTuning.h の数値を変更することで、操作感を柔軟に調整できることを確認します。
- 「位置」「速度」「加速度」の単位系と、デルタ時間(
deltaTime)を用いた積分の関係を説明できる - 摩擦によって速度を減速させ、0を通り越さずに停止する処理を実装できる
- 最高速度(
MaxSpeed)でクランプし、速度の過剰な増加を防止できる - 1フレームあたり1ピクセル未満の微小な移動量を蓄積して持ち越す端数処理を実装できる
今回のポイント
ゲーム物理における単位系の統一
本教材では、物理演算の単位系を以下のように統一しています。
| 物理量 | 単位 | 意味 | 毎フレームの計算式 |
|---|---|---|---|
| 位置(Position) | ピクセル($\text{px}$) | ワールド内の絶対座標 | $\text{位置} += \text{速度} \times \Delta t$ |
| 速度(Velocity) | ピクセル毎秒($\text{px/s}$) | 1秒間に進むピクセル数 | $\text{速度} += \text{加速度} \times \Delta t$ |
| 加速度(Acceleration) | ピクセル毎秒毎秒($\text{px/s}^2$) | 1秒間に増加する速度 | キー入力から与えられる変化量 |
速度と加速度は「1秒あたり」で指定し、1回の更新で進める時間を掛けます。この作品は第14回と同じ固定の1/60秒を使うため、実時間で指定どおりの速さになるのは毎秒60回更新できる場合です。
作業の準備
開始用ZIPには前回までの到達状態が含まれています。今回の新規ファイルは、本文を進めながら追加します。ファイルの登録方法や変更の引き継ぎ手順は、配布ファイルの手順で確認できます。
| 作業 | 対象 |
|---|---|
| 新規作成 | なし |
| 既存ファイルへ追記・編集 | Source/Platformer/Game.cpp、Source/Platformer/Player.cpp、Source/Platformer/Player.h、Source/Platformer/Tuning/GameTuning.h |
| 重点的に実装・確認する処理 | Player::Update |
ヘッダーの宣言、#include、登録テーブル、エラー処理などは、最終ステップの参考実装を参照できます。重点関数は各ステップで処理の流れを確認しながら記述します。関数を変更する際は、宣言・定義・呼び出し元の整合性を保ちます。
GameTuning.h には今回必要な定数を追記し、自身で調整した既存の値を維持します。
授業の進め方
velocity_)を状態として保持し、キー入力に応じて加速度を加算する物理モデルへと移行します。2 / 4摩擦と最高速度を加えるキーを離した際に床の摩擦によって速度をゼロへ近づけて停止させ、最高速度(MaxSpeed)でクランプして速度の過剰な増加を防ぎます。3 / 41ピクセル未満の移動を持ち越す1フレームあたりの移動量が1ピクセル未満になる微小な移動量を切り捨てずに蓄積し、低速時でも移動が消失しない端数持ち越し処理を実装します。4 / 4操作感を数値から比較する加速度、最高速度、摩擦の3つのパラメータを個別に変更し、プレイヤーの立ち上がり、最高速度、および停止距離に与える影響を比較・検証します。動作確認
- 押し始めから最高速度まで段階的に加速する
- キーを離した際に速度が0を越えて反対向きにならない
- 低速移動時でも端数が蓄積されて座標が進む
- 調整値の変更によって加速感と停止距離を個別に制御できる