Skip to content

第17回 加速度、摩擦、移動の端数

第16回までは、キーを押すと即座に一定速度で進み、離すと停止する等速直線運動で移動していました。
第17回では、キー入力に応じた「加速度」と、床との「摩擦」による減速を導入し、滑らかな加減速運動を実装します。さらに、1フレームあたりの移動量が1ピクセル未満になる微小な移動を切り捨てずに保持する「端数蓄積(Remainder)」の仕組みを学びます。

配布プロジェクト

第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秒あたり」として一貫させることで、フレームレートが変動しても一定の移動速度が維持されます。

作業の準備

開始用ZIPには前回までの到達状態が含まれています。今回の新規ファイルは、本文を進めながら追加します。ファイルの登録方法や変更の引き継ぎ手順は、配布ファイルの手順で確認できます。

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

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

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

授業の進め方

動作確認

  • 押し始めから最高速度まで段階的に加速する
  • キーを離した際に速度が0を越えて反対向きにならない
  • 低速移動時でも端数が蓄積されて座標が進む
  • 調整値の変更によって加速感と停止距離を個別に制御できる

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