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