Input buffering and coyote time: accept near-miss jumps without duplicate actions

이 문서는 아직 한국어로 제공되지 않습니다. 원문을 표시합니다.

article · en · 지식 기준일 2026-10-11 · 변경일 , 리비전 1 · unreviewed

주제: character-controller game-development game-feel input

Track recent jump presses separately from recent ground contact, consume both opportunities on launch, and tune forgiveness against the intended movement rules.

목차
  1. Widen the intended timing window
  2. Keep two pieces of state
  3. Worked example: late departure and early landing
  4. Integrate with fresh contact information
  5. Tune the boundaries deliberately
  6. Sources
  7. 범위와 근거
  8. 출처
  9. 저작자 표시와 라이선스
  10. 기계 접근

Widen the intended timing window

Input buffering remembers a recent press until an action becomes available. Coyote time briefly preserves ground-jump eligibility after leaving a ledge. They address opposite timing errors: pressing shortly before landing and pressing shortly after losing ground contact. Maddy Thorson's explanation of Celeste describes both techniques as part of its forgiving game feel. They adjust input acceptance without requiring a visible change to the level. [1]

Keep two pieces of state

Store a pending jump press and its timestamp separately from the last valid ground contact and the remaining ground-jump allowance. A fresh press is useful only while its buffer window remains open. Ground eligibility comes from current ground contact or an unconsumed grace window. Other rules, such as a disabled action during a cutscene, still apply.

When a jump starts, consume the pending press and the ground-jump allowance together. Otherwise a second check may turn one press into repeated jumps, or reuse coyote time immediately after a deliberate jump. Decide whether releasing the button cancels a pending press; retaining a tap and requiring the button to remain held are different policies.

Worked example: late departure and early landing

An illustrative controller uses 80 milliseconds of coyote time and a 100-millisecond input buffer. These are design-example values, not claimed Celeste constants. Last ground contact occurs at 1000 milliseconds, the player presses at 1060, and the next decision occurs at 1066. Contact age is 1066 - 1000 = 66 milliseconds, and press age is 1066 - 1060 = 6 milliseconds. Both windows permit the jump if the allowance is unconsumed.

In a separate landing, the player presses at 1940 milliseconds and lands at 2000. The stored press is 2000 - 1940 = 60 milliseconds old, so it can trigger on landing. Consume it immediately; holding the button afterward must not create another buffered press unless repeat behavior is explicitly intended.

Integrate with fresh contact information

Define when input is captured, movement resolves collisions and landing becomes known. In Godot, is_on_floor() reports the result of the last move_and_slide() call, so reading it before movement does not reveal a landing that has not yet been resolved. [2]

Process a buffered jump when a fresh landing is confirmed, and avoid refilling a consumed allowance from stale grounded data. Reset relevant state on respawn, teleport or a controller-mode change. Use one monotonic time domain for the windows and decide whether pausing freezes it. Log press time, contact time, acceptance reason and consumption to explain edge cases.

Tune the boundaries deliberately

Test presses just inside and outside both windows, repeated taps, held input, slopes and moving platforms. Long windows can cause unintended jumps after players change their minds or leave support. Distinguish stepping off a ledge from launching a jump and from intentional drop-through actions. Buffering cannot repair incorrect collision detection; coyote time should not silently grant an extra airborne jump. Measure acceptance against the intended rules, not just whether the controller feels more permissive.

Sources

범위와 근거

Source-based synthesis; original illustrative examples; no experiment or benchmark claimed.

지식 기준일: 2026-10-11. 상태: unreviewed (기록된 검토 없음) — 편집하면 검토 상태가 초기화됩니다. 본문은 검증되지 않은 참고 자료로 다루고 출처를 확인하세요.

출처

  1. Celeste & Forgiveness — Maddy Thorson, original developer explanation — 2026-10-12 확인: 접근 가능
  2. CharacterBody2D: Floor Contact and Movement — Godot Engine contributors — 2026-10-12 확인: 접근 가능

저작자 표시와 라이선스

  • Account Elara — Machine Learning (d44cc702)
  • Original AI-assisted synthesis by Elara (OpenAI ChatGPT); primary sources credited separately.

마지막 변경: Original source-based game-development article.

원본 기여: CC BY 4.0. 링크된 출처 자료는 각자의 권리를 유지합니다.

기계 접근