ジャンプの初速と重力の決め方:高さと滞空時間から逆算

2Dゲームのジャンプを初速と重力から設計する方法を解説。最高到達点・滞空時間の式、高さと滞空時間からの逆算、フレーム実装の誤差、斜め投射との違いを数値例で紹介します。

2Dアクションを作っていて、「ジャンプが重い」「ふわふわして足が地面に着かない」と感じたことはないでしょうか。多くの場合、原因はジャンプの初速と重力の組み合わせです。数値を感覚で触っていると、高さを変えたつもりが滞空時間まで変わってしまい、調整が堂々巡りになります。この記事では、初速と重力から最高到達点や滞空時間を求める式を整理し、逆に「この高さ・この滞空時間にしたい」から数値を決める手順まで説明します。

基本の考え方:初速と重力の2つで決まる

ジャンプは「上向きの初速を与え、毎秒一定の割合で下向きに引っ張る」だけの動きです。初速を v、重力加速度を g とすると、着地点が出発点と同じ高さの場合、次の関係が成り立ちます。

ここで重要なのは、高さが初速の2乗に比例し、重力に反比例する点です。初速を2倍にすると高さは4倍、滞空時間は2倍になります。一方で重力を2倍にすると、高さも滞空時間もちょうど半分になります(どちらも g に反比例するため)。高さと滞空時間は別々のつまみに見えて、実は2つの数値で連動しています。

数値の例:初速600、重力1800の場合

単位をピクセルと秒にして、初速 600 px/秒、重力 1800 px/秒²、水平速度 240 px/秒としてみます。Pythonで計算した結果は次の通りです。

キャラクターの身長が64pxなら、自分の身長の約1.5倍まで跳べる設定だと分かります。ステージ設計では「この段差は100px未満、この穴の幅は160px未満」という上限がそのまま決まるため、数値を先に把握しておくとレベルデザインが楽になります。

高さと滞空時間から逆算する

実際の制作では「高さ120pxを0.5秒で往復したい」のように、手触りの目標から入るほうが調整しやすくなります。先ほどの式を逆に解くと、次のようになります。

初速 v = 4 × 高さ ÷ 滞空時間
重力 g = 8 × 高さ ÷ 滞空時間²

高さ120px、滞空時間0.5秒なら、v = 960 px/秒、g = 3840 px/秒² です。検算すると 960² ÷ (2 × 3840) = 120 となり、目標と一致します。「高さを変えずに滞空時間だけ短くしたい」場合も、この式に新しい時間を入れ直せば、初速と重力を同時に正しく更新できます。

フレーム単位で実装するときの注意

ゲームでは1フレームごとに速度と位置を更新します。60fpsなら、1フレームの重力は 1800 ÷ 60² = 0.5 px/フレーム²、初速は 600 ÷ 60 = 10 px/フレームです。実装は次のような形が一般的です。

vy -= g * dt;   // 先に速度を更新
y  += vy * dt;  // その速度で位置を更新

この順序(速度を先に更新)で上の例を回すと、39フレームで着地し、最高点は95pxになりました。理論値の100px、40フレームより少し低くなります。順序を逆にして位置を先に更新すると、最高点105px、41フレームと逆方向にずれます。誤差は1フレーム分の離散化によるもので、どちらが間違いというわけではありません。ただし、ステージの高さ制限をぎりぎりに設計すると、更新順序の違いで届かなくなることがあるため、余裕を持たせるか、実装した式で実測した値を基準にしてください。

もう1つの落とし穴は、フレームレートが変動する環境です。経過時間 dt を掛けて更新していても、dt が大きく揺れると高さが変わります。ジャンプの再現性が重要な作品では、物理更新を固定間隔で行う方法が安全です。

手触りの調整:上昇と下降で重力を変える

現実の放物線は上昇と下降が対称ですが、ゲームではあえて崩すことが多くあります。たとえば下降時だけ重力を1.5倍にすると、上昇に約0.333秒、下降に約0.272秒かかり、滞空時間は約0.605秒に縮みます。キビキビとした落下になり、着地のタイミングも読みやすくなります。ここでの下降時間は、頂点100pxから重力2700 px/秒²で落ちる計算(√(2 × 100 ÷ 2700))です。

ほかに、ボタンを早く離すと上昇を打ち切って低いジャンプにする方法もあります。この場合は式の前提(一定の重力、最後まで跳び切る)から外れるので、最高到達点は実機で測って確認する必要があります。

斜め投射(放物線)との違い

ジャンプは「垂直方向は初速と重力、水平方向は一定速度」と分けて考えます。これに対して、砲弾やボール投げのように角度と速度で発射する場合は、速度を水平成分(速度 × cos 角度)と垂直成分(速度 × sin 角度)に分けます。例えば発射速度500、角度45°、重力980、初期高さ0なら、滞空時間は約0.722秒、飛距離は約255.1です。

初期高さがあると結論が変わります。高さ100から同じ条件で撃つと、45°の飛距離は約332.0ですが、30°では約335.1になり、30°のほうが遠くへ届きます。「45°が最も遠い」は初期高さが0のときだけ成り立つ話なので、崖の上から撃つ攻撃などでは角度の判断基準を変える必要があります。空気抵抗を入れると結果はさらに変わりますが、上の式には含まれていません。

関連ツールの使い方

ジャンプ軌道計算機に初速・重力・水平速度・FPSを入れると、最高到達点と滞空時間を一度に確認できます。角度で発射する場合は放物線軌道計算機、移動量を1フレームあたりに換算したいときは移動速度計算機、移動後の位置を確認するなら2D座標計算機が役立ちます。

まとめ

ジャンプの数値は、初速と重力の2つで高さと滞空時間が同時に決まります。感覚でいじる前に、目標の高さと滞空時間を決めて、v = 4h ÷ T、g = 8h ÷ T² で逆算するのが近道です。実装後は離散化による誤差を実測し、下降重力の強化などで手触りを整えてください。

この記事に関連するツール