Quick answer: GameMaker keyboard_check_released firing twice per key release? You’re polling in two events — the released state stays true for one frame but you read it from both places.
An inventory hotkey fires twice on each release. Both the Step event and a controller-overlap event read the released state.
One-Frame Window
keyboard_check_released returns true only during the single frame the key transitioned to up. If you check from Step and also from Async / Other events that frame, both see true.
Read in Step Only
The Step event is the canonical place to read input. Other code reads cached input state set by Step. Single source of truth.
Consume Pattern
var released = keyboard_check_released(vk_space);
if (released) {
do_jump();
}Bind once per frame. Other events read your boolean.
Input Manager Object
A persistent “Input Manager” instance that exposes booleans (jumped_this_frame, etc.) cleanly handles cross-instance access without duplicate polling.
Verifying
Release events fire exactly once per key release. No double-fire under fast input.
“Released state is true for one frame. Poll once, share via a manager.”
Centralize input in one object — double-polling is one symptom of decentralized input; the bigger problem is no single place to mod / log inputs.