godot-input-handling
Expert patterns for input handling covering InputMap actions, InputEvent processing, controller support, rebinding, deadzones, and input buffering. Use when setting up player controls, implementing input systems, or adding gamepad/accessibility features. Keywords InputMap, InputEvent, gamepad, contr
By thedivergentai · 374 installs
npx skills add thedivergentai/gd-agentic-skills --skill godot-input-handling
Source repository · Upstream listing
Input Handling
Handle keyboard, mouse, gamepad, and touch input with proper buffering and accessibility support.
MANDATORY script triggers (by scenario)
Scenario Load before coding
Jump/dash/coyote feel [input buffer.gd](scripts/input buffer.gd) (physics tied decay) + [advanced input buffer.gd](scripts/advanced input buffer.gd) for multi action priority
Settings remapping UI [safe runtime rebind.gd](scripts/safe runtime rebind.gd) ( ConfigFile persist to user:// )
Analog stick movement [analog deadzone manager.gd](scripts/analog deadzone manager.gd) — never raw axis without radial deadzone
"Press X / Press E" prompts [glyph prompt manager.gd](scripts/glyph prompt manager.gd)
UI nav vs gameplay confirm [input echo filter.gd](scripts/input echo filter.gd) — echoes move menus, not Confirm/Back
Gameplay vs menu clicks [unhandled input priority.gd](scripts/unhandled input priority.gd)
Do NOT Load (by scenario)
Scenario Load Do NOT load
Settings remapping UI safe runtime rebind.gd multi touch gestures.gd , mouse capture manager.gd , combo/replay injectors
Mobile / touch gestures multi touch gestures.gd mouse capture manager.gd , desktop remapper persistence
Jump/dash buffer only input buffer.gd / advanced input buffer.gd Remapper, multi touch, replay, combo validator
FPS mouse look mouse capture manager.gd + deadzone/glyph as needed multi touch gestures.gd , combo/replay
Combo / fighting sequences combo validator.gd + buffers Touch gestures, mouse capture
Replay / virtual injection tests input replay buffer.gd / virtual input injector.gd Remapper UI, multi touch
Available Scripts
[advanced input buffer.gd](scripts/advanced input buffer.gd)
Frame perfect input buffering system for responsive jumps, dashes, and combo chains.
[input buffer.gd](scripts/input buffer.gd)
Timed action buffer with physics process decay so windows match CharacterBody consumption, not render FPS.
[safe runtime rebind.gd](scripts/safe runtime rebind.gd)
Dynamic input rebinding with conflict detection and user://input rebinds.cfg persistence.
[analog deadzone manager.gd](scripts/analog deadzone manager.gd)
Radial deadzone management for analog sticks to eliminate drift while maintaining natural follow through.
[multi touch gestures.gd](scripts/multi touch gestures.gd)
Handling touch, drags, and pinch to zoom gestures for mobile and touchscreen compatibility.
[input echo filter.gd](scripts/input echo filter.gd)
Filtering echo events to distinguish between hold to navigate (UI) and one time gameplay actions.
[mouse capture manager.gd](scripts/mouse capture manager.gd)
Robust mouse capture and sensitivity scaling logic for FPS and mouse intensive systems.
[hold toggle accessibility.gd](scripts/hold toggle accessibility.gd)
Software side support for user defined 'Hold' vs 'Toggle' accessibility preferences.
[glyph prompt manager.gd](scripts/glyph prompt manager.gd)
Real time switching between Keyboard and Gamepad UI prompts based on the last active device.
[action state machine.gd](scripts/action state machine.gd)
Tracking the lifecycle of an action ('Just Pressed', 'Held', 'Released') for complex state logic.
[unhandled input priority.gd](scripts/unhandled input priority.gd)
Demonstrating the correct use of unhandled input to prevent gameplay logic from leaking into UI.
[virtual input injector.gd](scripts/virtual input injector.gd)
Input.parse input event injection for CI tutorials / AI assistance — not physical hardware.
[combo validator.gd](scripts/combo validator.gd)
Rolling timed sequence buffer for special move validation (fighting / action RPG).
[input replay buffer.gd](scripts/input replay buffer.gd)
Frame tagged capture + deterministic replay via parse input event .
NEVER Do in Input Handling
NEVER poll input in process() for gameplay actions — Use physics process() or unhandled input() . process() is frame rate dependent, causing dropped inputs at low FPS [22].
NEVER use hardcoded key checks (e.g., KEY W ) — Always use InputMap actions. Hardcoded keys prevent rebinding and break compatibility with non QWERTY layouts [23].
NEVER ignore analog stick deadzones — Drifting sticks at 0.05 magnitude will cause unintended movement. Implement a radial deadzone (not axial) in code or settings [24].
NEVER assume a single input device — Players may switch between Keyboard and Controller mid session. Use Input.joy connection changed to update UI prompts dynamically [25].
NEVER use input() for gameplay actions — input() fires for ALL events (including UI). Use unhandled input() so gameplay logic doesn't trigger while clicking menus [26].
NEVER omit input buffering in fast paced games — If a player presses jump 50ms before landing, the input is lost without a buffer. Implement a 100 150ms buffer for a "tight" feel [27].
NEVER use Input.is action pressed() for one time triggers — It returns true every frame the key is held. Use just pressed for jumps, attacks, and toggles to avoid logic spam.
NEVER implement manual 'Hold vs Toggle' logic in multiple places — Centralize it in a setting or input wrapper to ensure accessibility consistency across the whole game.
NEVER forget to handle InputEvent.is echo() in UI navigation — Echo events (keyboard repeat) should move menus but rarely should they trigger "Confirm" or "Back" actions.
NEVER capture the mouse without a 'Release' shortcut — If your game crashes or blocks ui cancel , the user is trapped. Always provide a fallback escape for mouse capture.
Input Propagation & Isolation
Godot propagates input events in a specific order. Understanding this is key to isolating UI from gameplay.
1. input(event) : High priority global intercept. Use for dev consoles or debug overlays.
2. gui input(event) : Handled by Control nodes (UI) . If a UI element consumes the event (e.g., clicking a button), it calls accept event() , stopping further propagation.
3. unhandled input(event) : Reached ONLY if no UI element consumed the event. Expert Pattern : Put all gameplay logic (jump, shoot) here to prevent accidental triggers while interacting with menus.
InputMap Best Practices
Avoid physical key checks. Define semantic actions (e.g., move left , interact ) in Project Settings Input Map .
1. Analog Deadzones
Analog sticks suffer from drift. MANDATORY : [analog deadzone manager.gd](scripts/analog deadzone manager.gd). Prefer Input.get vector() for circular deadzones — never subtract axes into a square deadzone.
2. Expert polling delta (no hardcoded keys)
Gameplay samples actions in physics process / unhandled input — never KEY / MOUSE BUTTON branches. Pause/cancel must be InputMap actions (e.g. ui cancel ) so rebinds and non QWERTY layouts work. See [unhandled input priority.gd](scripts/unhandled input priority.gd).
Multi Modal Input & UI Glyphs
Modern games must handle simultaneous Controller and Keyboard/Mouse input smoothly.
1. Handling Input Modes
Mouse Aiming : Process InputEventMouseMotion in unhandled input() for relative movement ([mouse capture manager.gd](scripts/mouse capture manager.gd)).
Stick Movement : Poll vectors in physics process() after [analog deadzone manager.gd](scripts/analog deadzone manager.gd).
2. Dynamic Glyph Swapping
MANDATORY : [glyph prompt manager.gd](scripts/glyph prompt manager.gd) for last device prompt swaps. Do not hand roll event is InputEventJoypadButton detectors in every HUD widget.
Expert Input Extensions (script sole source)
Input buffering — MANDATORY : [input buffer.gd](scripts/input buffer.gd) + [advanced input buffer.gd](scripts/advanced input buffer.gd). Do not paste jump timer tutorials inline.
Coyote time — Owned by movement skills: [godot characterbody 2d](https://github.com/thedivergentai/gd agentic skills/blob/main/skills/godot characterbody 2d/SKILL.md) ( frame perfect coyote time.gd ) and [godot genre platformer](https://github.com/thedivergentai/gd agentic skills/blob/main/skills/godot genre platformer/SKILL.md). Pair with buffers from this skill; do not re implement coyote here.
Multiplayer input sync — Do not RPC sync input here. Route to [godot multiplayer networking](https://github.com/thedivergentai/gd agentic skills/blob/main/skills/godot multiplayer networking/SKILL.md) for authoritative action snapshots / get remote sender id validation.
Virtual injection — MANDATORY : [virtual input injector.gd](scripts/virtual input injector.gd) ( Input.parse input event ).
Combo sequences — MANDATORY : [combo validator.gd](scripts/combo validator.gd); fighting fiction stays in godot genre fighting .
Deterministic replay — MANDATORY : [input replay buffer.gd](scripts/input replay buffer.gd).
Deep recipes (on demand)
Topic Reference / script
Buffering / coyote / MP sync [input event processing.md](references/input event processing.md)
Virtual injection / combos / replay [expert input extensions.md](references/expert input extensions.md)
InputMap & device IDs [inputmap best practices.md](references/inputmap best practices.md)
Reference
Progressive disclosure: open Official Documentation links only when researching a specific API; load Related Skills when routing to a peer domain — do not preload the whole lattice.
Official Documentation
[Using InputEvent](https://docs.godotengine.org/en/stable/tutorials/inputs/inputevent.html) — Event propagation order ( input → GUI → unhandled input ) and why gameplay belongs after UI consumes events.
[Input examples](https://docs.godotengine.org/en/stable/tutorials/inputs/input examples.html) — Practical InputMap action polling, mouse buttons, and keyboard patterns this skill builds on.
[Controllers, gamepads, and joysticks](https://docs.godotengine.org/en/stable/tutorials/inputs/controllers gamepads joysticks.html) — Joypad connection, button/axis events, and multi device mapping for remappers and glyph swaps.
[Controller vibration and features](https://docs.godotengine.org/en/stable/tutorials/inputs/controller features.html) — Extended pad capabilities beyond basic buttons when shipping console style feedback.
[Mouse and input coordinates](https://docs.godotengine.org/en/stable/tutorials/inputs/mouse and input coordinates.html) — Viewport vs screen coordinates for clicks, aim, and capture relative motion.
[Customizing the mouse cursor](https://docs.godotengine.org/en/stable/tutorials/inputs/custom mouse cursor.html) — Cursor shapes alongside Input.mouse mode capture/release flows.
[Handling quit requests](https://docs.godotengine.org/en/stable/tutorials/inputs/handling quit requests.html) — Safe ESC / back / quit paths so mouse capture never traps the player.
[Input](https://docs.godotengine.org/en/stable/classes/class input.html) — Singleton API: is action , get vector , mouse mode , parse input event , and joy connection signals.
[InputMap](https://docs.godotengine.org/en/stable/classes/class inputmap.html) — Runtime action add event / erase / conflict checks for safe rebinding.
[InputEvent](https://docs.godotengine.org/en/stable/classes/class inputevent.html) — Base event API including is echo() , is action pressed() , and device IDs.
[Idle and Physics Processing](https://docs.godotengine.org/en/stable/tutorials/scripting/idle and physics processing.html) — Why hold/poll gameplay input in physics process , not frame tied process .
[Control](https://docs.godotengine.org/en/stable/classes/class control.html) — gui input / accept event so menus stop events before unhandled input gameplay.
Related Skills
Prerequisites
[godot project foundations](https://github.com/thedivergentai/gd agentic skills/blob/main/skills/godot project foundations/SKILL.md) — Projec