Quick answer: Buffer the press in _input(): set jump_buffered = true. Read and clear in _physics_process. Press never lands between ticks because _input fires immediately on the event.
Player taps Jump quickly, character doesn’t jump. is_action_just_pressed cleared between physics ticks because the press happened off-tick.
The Symptom
Quick taps occasionally don’t register. Holding the key long enough always works because is_action_pressed is read each tick.
The Fix
extends CharacterBody2D
var jump_buffered := false
func _input(event: InputEvent) -> void:
if event.is_action_pressed("jump"):
jump_buffered = true
func _physics_process(delta: float) -> void:
if jump_buffered and is_on_floor():
velocity.y = JUMP_VELOCITY
jump_buffered = false
_input runs immediately when the event arrives, regardless of physics tick timing. Buffer survives until the next physics tick, which always sees and clears it.
Verifying
Tap fast. Every tap should jump. Without the buffer: occasional miss. With: 100% pickup.
“Capture in _input. Consume in _physics_process. Never miss.”
Related Issues
For input deadzone, see deadzone. For shortcut context, see shortcut.
Buffer the input. Tick reads cleanly.