This explanation is currently available in Japanese.
ひとことで
ジャンプした頭が天井の角にほんの少しだけぶつかったとき、そのまま頭を打たせて落とすのではなく、体を横へ数ピクセルずらして通してあげる補正です。当たり判定の上では確かに重なっていても、見た目にはほとんど触れていないので、頭を打って落ちると遊ぶ人は理不尽に感じます。
ゲームでの使いどころ
- 2D アクションのジャンプ:足場の下の角に頭がかすったとき、横へずらしてそのまま上の足場に乗せる。『Celeste』などの精密なアクションで知られる。
- 狭い穴・通路への飛び込み:幅ぎりぎりの穴を上へ抜けるとき、少しずれていても通す。
- 横方向の角:段差の角に足先がかすったときに少し持ち上げて乗せる(ステップアップ)、ダッシュが壁の角にかすったときに横へずらす、なども同じ考え方。
しくみ
上へ動いた結果、頭が天井のブロックと重なったとします。プレイヤーの左右の端を 、ブロックの左右の端を とすると、
- ブロックの左の角に当たったときの重なり:
- ブロックの右の角に当たったときの重なり:
です。補正する最大の幅を として、
- で、左へ だけずらした位置が空いていれば、左へずらして上昇を続ける。
- で、右へ だけずらした位置が空いていれば、右へずらして上昇を続ける。
- どちらでもなければ、ふつうに頭を打ち、縦の速度を 0 にする。
はキャラクターの幅の 1/4〜1/2 程度(ドット絵なら 2〜4 ピクセル)がよく使われます。
実装のポイント
- ずらした先が空いているか確かめる:押し出した先に別の壁があると、壁の中に入り込みます。必ず移動先の当たり判定を調べます。
- 上昇中だけ:落下中や横移動中に同じ補正をすると、壁をすり抜けて見えることがあります。
- 軸ごとに解く:横と縦を別々に動かして当たり判定を解く作りにしておくと、「縦の移動で天井に当たった」ことがはっきりわかり、補正を入れやすくなります。
- 横方向の速度は保つ:補正で位置をずらしても、横の速度は変えません。遊ぶ人の操作をそのまま生かします。
つまずきやすい点
- 補正の幅が大きすぎる:重なりが大きくても通してしまい、ブロックの中をすり抜けたように見えます。補正はかすった程度だけにとどめます。
- 狭い隙間での振動:左右両方の角に近い狭い隙間では、左右の補正が交互に起きて震えることがあります。重なりの小さい方だけを選びます。
- 一方通行の足場:下から通り抜けられる足場では、そもそも頭がぶつからないので補正はいりません。補正の対象を固いブロックに限ります。
デモで試すこと
- 2 つの列で、同じ位置から真上に跳び、少しして右へ走り出します。頭の右端が、上の足場の左下の角に 14 cm だけ重なっています(赤い帯)。
- 左の「補正なし」は頭を打って落ち、足場の下をくぐって走り去ります。右の「補正あり」は、体が左へずらされてそのまま上昇し、上の足場に乗れます。黄色の線(頭の通った道すじ)の違いを見比べてください。
- 「頭と角の重なり」を「補正する最大の幅」より大きくすると、右の列も頭を打つようになります。
- 「補正する最大の幅」を 0 にすると、両方の列が同じ結果になります。