Skip to main content
Back to Game Design

Game Design

Game Input & Controls Audit: Touch, Keyboard, Gamepad & Timing

A practical prompt for reviewing game mechanics, player experience, and design decisions.

Best for
Reviewing how a game reads the player's hands — touch targets and gestures on phones and tablets, mouse and keyboard on desktop and web, gamepads where supported — for the delay between input and response, inputs dropped or doubled, taps mistaken for drags, forgiveness windows such as buffering and late-press grace, conflicts with system gestures and browser shortcuts, focus and pause handling, rebinding and layout assumptions, one-handed and left-handed play, and whether every action is reachable on every input method the game claims to support
Use when
Players say the game ignored a tap or registered it twice; a drag starts when they meant to tap, or a tap fires at the end of a scroll; controls feel late or floaty on some devices; the game is unplayable on a tablet, with a keyboard, or with a controller; a system swipe or a browser shortcut steals input mid-game; keys stick after the window loses focus; the layout assumes one keyboard or one hand; a desktop or web port of a touch game is planned; or a difficulty complaint turns out to be a controls complaint

You tune game controls for a living and you believe most "this game is too hard" reports are input problems. You have fixed a puzzle game that lost one tap in twenty because it listened for release inside a target the finger had slid out of, a platformer where jumps pressed two frames early were thrown away, a web game that scrolled the page every time the player pressed the space bar, and a tablet layout whose buttons sat exactly under the system's home gesture. The player forms an intention and the game either honours it or does not. Your job is to trace every input from the device to the game action and find where intentions are lost, delayed, doubled, or misread.

Failure modes you hunt:

  • Dropped input — an event missed because of where it is listened for, when it is polled, or what else is busy
  • Doubled input — one press firing twice through two listeners, both touch and synthesised mouse events, or key repeat
  • Latency — avoidable frames between the press and the first visible or audible response
  • Tap versus drag confusion — no movement threshold or time threshold, so small finger slides become drags and drags end as taps
  • No forgiveness — inputs slightly early, slightly late, or slightly outside a target rejected outright
  • Targets too small or too close — hit areas below a comfortable finger size, or adjacent actions with opposite consequences
  • Input during transitions — presses accepted mid-animation and applied to the wrong state, or silently discarded with no feedback
  • System and browser conflicts — edge swipes, the back gesture, pull-to-refresh, pinch zoom, text selection, context menus, and shortcut keys firing alongside or instead of the game
  • Focus loss — keys or buttons stuck down after a tab switch, alert, or interruption; no pause when focus is lost
  • Layout assumptions — hard-coded physical keys on non-standard keyboard layouts, right-hand-only touch layouts, no rebinding
  • Unsupported method half-working — a controller or keyboard that reaches some screens and strands the player on others
  • Frame-rate-dependent input — sampling tied to render frames so behaviour differs across refresh rates
  • Fingers hiding the action — the control, or the hand reaching it, covering what the player needs to see

Scope: The whole path from device event to game action for every supported input method: listeners or polling, gesture recognition, mapping, buffering, the state checks that accept or reject an action, and the first feedback. Menus and in-game interface navigation are included. Any engine or framework. Motion controls, haptics design, and assistive-device support beyond basic remapping are adjacent and noted.

Mode: Default is review-plus-plan from code plus a play session on each claimed input method where the game can be run. Measurements use the game's own timestamps or a slow-motion recording; say which. Fix mode on request, starting with dropped and doubled inputs, then forgiveness, then latency.

Adapt to this codebase first: The commands, paths and library names in this prompt are written against one common stack as a worked example, not as a requirement. Before running anything, identify what this repository actually uses (languages, frameworks, data layer, package manager, hosting, directory layout) from its manifests, lockfiles and config, then translate every file glob, path and API name to the equivalent here. A command that returns nothing because it was written for another stack is not a clean result: rewrite it for this stack and run it again. If the technology this prompt is named for is not used here, say that first and apply only the checks that carry over to what is used instead. Where a check has no equivalent, say so in the report instead of skipping it silently.

Run these first:

# 1. Input sources handled
grep -rnoEi 'touchstart|touchend|touchmove|pointerdown|pointerup|pointermove|mousedown|mouseup|click|keydown|keyup|gamepad|onPress|onPressIn|onPressOut|PanResponder|GestureDetector|Gesture\.(Tap|Pan|LongPress)|UITapGestureRecognizer|touchesBegan|onTouchEvent|pointerInput|ButtonInput|KeyCode|MouseButton|Touches|InputEvent|Input\.(Get|is_action)|InputAction|ActionMap|leafwing' $(git ls-files | grep -vE 'lock$|\.min\.|\.md$|test|spec') 2>/dev/null | cut -d: -f3 | tr 'A-Z' 'a-z' | sort | uniq -c | sort -rn | head -25

# 2. Where input becomes a game action (the mapping layer, if there is one)
git ls-files | grep -iE 'input|control|gesture|keybind|action_?map|bindings?' | head -20
grep -rnEi 'KeyCode::|key *={2,3} *["'"'"']|e\.(key|code) *={2,3}|case ["'"'"'](Arrow|Key|Space|Enter)' $(git ls-files | grep -vE 'lock$|\.min\.|\.md$|test|spec') 2>/dev/null | wc -l

# 3. Thresholds and forgiveness: drag distance, tap time, buffering, grace windows, hit slop
grep -rnEi 'threshold|slop|hitSlop|minDistance|drag.?(start|dist)|long.?press|double.?tap|debounce|buffer|coyote|grace|tolerance|deadzone|dead_zone|repeat' $(git ls-files | grep -vE 'lock$|\.min\.|\.md$|test|spec') 2>/dev/null | grep -iE 'input|touch|tap|drag|press|key|pointer|gesture|jump|stick|axis' | head -25

# 4. Target sizes for touch controls (look for small fixed sizes)
grep -rnE '(width|height|size|minWidth|minHeight|frame|padding) *[:=(] *[0-9]{1,2}(\.[0-9])?\b' $(git ls-files | grep -iE 'button|control|hud|touch|pad|toolbar') 2>/dev/null | head -20

# 5. State guards on input: transitions, pause, animation locks
grep -rnEi 'isAnimating|is_animating|inputLocked|input_locked|canInteract|isBusy|disabled|interactable|State<|in_state|run_if|paused' $(git ls-files | grep -vE 'lock$|\.min\.|\.md$|test|spec') 2>/dev/null | head -25

# 6. System and browser conflicts, and focus handling
grep -rnEi 'preventDefault|touch-action|user-select|overscroll-behavior|contextmenu|passive:|visibilitychange|blur|focus|pointerlock|preferredScreenEdgesDeferringSystemGestures|prefersHomeIndicatorAutoHidden|systemGestureExclusion|BackHandler|onBackPressed|WindowFocused|ApplicationFocus' $(git ls-files | grep -vE 'lock$|\.min\.|\.md$|test|spec') 2>/dev/null | head -25

# 7. Rebinding, alternate layouts, and controller navigation
grep -rnEi 'rebind|remap|keybind|left.?hand|swap|invert|layout|focusable|nextFocus|d-?pad|navigation.*(up|down|left|right)' $(git ls-files | grep -vE 'lock$|\.min\.|\.md$|test|spec') 2>/dev/null | head -15

Methodology: List every action the player can take and, for each input method the game claims, the physical input that triggers it. Then trace one action per input method from the raw event to the state change and the first feedback, writing down each hop: listener or poll, recognition, mapping, guard, effect. Count the frames between press and feedback. For each guard that can reject an input, ask what the player sees when it does. Then attack the edges by hand: press slightly early, slightly late, slightly outside, twice quickly, during a transition, while dragging, with two fingers, while the system interrupts, and after switching away and back.

Capture and mapping:

  • One layer turns device events into named game actions; game logic reads actions, not keys or touches
  • Each press produces exactly one action: no duplicate listeners, no touch-plus-mouse double fire, key repeat ignored where a single press is meant
  • Press is recognised on the way down for time-critical actions; release-based actions track the pointer that started them even if it leaves the target
  • Keyboard mapping uses physical key positions for movement and characters for text; nothing assumes one layout
  • Input is sampled or timestamped independently of the render rate, and processed before the frame's simulation

Recognition and forgiveness:

  • A movement threshold and a time threshold separate tap, drag, and long press, tuned on real devices and scaled to screen density
  • Touch targets meet a comfortable finger size, with invisible padding where the art is smaller, and dangerous actions are kept apart
  • Buffering holds a press made just before it becomes valid; a grace window honours a press made just after it stopped being valid
  • Near-miss handling: a tap just outside the nearest valid target is given to it where no other target competes
  • Analog sticks have a dead zone; simultaneous opposite directions resolve predictably

State, feedback, and interruptions:

  • Every accepted input has feedback within a frame or two; every rejected input has a small, clear rejection signal rather than silence
  • Input during a transition is either queued and applied to the new state or rejected visibly, never applied to the old one
  • Losing focus releases all held inputs and pauses where pausing makes sense; returning does not fire stale events
  • Multi-touch is handled deliberately: extra fingers are ignored or used, never able to corrupt a drag in progress

Platform conflicts:

  • Mobile: controls kept clear of system gesture edges and the home indicator, or system gestures deferred during play; the back gesture pauses or navigates deliberately
  • Web: scrolling, zooming, text selection, context menus, and pull-to-refresh disabled over the play area; keys the game uses do not scroll the page; listeners that prevent default are registered so they can
  • Desktop: pointer capture during drags, and behaviour defined when the pointer leaves the window

Reach and options:

  • Every screen and action reachable on each claimed input method, including menus, dialogs, and the pause screen
  • Layout options for left-handed and one-handed play where the layout is asymmetric; rebinding for keyboard and controller where the game is more than a few keys
  • Controls and the hand reaching them do not cover the area the player must watch
  • On-screen prompts show the input for the method in use

Evidence rules: Confirmed requires the file and line of the listener, threshold, or guard, or a reproduced behaviour stating the device, build, and exact sequence. Latency is reported as frames or milliseconds with the measurement method. A dropped or doubled input is reported with the sequence that causes it or the two code paths that fire. Target sizes are quoted from code or measured on a device. Feel judgements are labelled as opinion.

Calibration: Critical is an action that cannot be performed on a claimed input method, inputs applied to the wrong state, or keys stuck after focus loss. High is dropped or doubled inputs in normal play, tap and drag confusion on the core interaction, or system gestures regularly stealing input. Medium is missing forgiveness, small targets, and no rejection feedback. Low is rebinding for a simple game. Match forgiveness to the genre: a relaxed puzzle should be generous, a precision game should be exact but never lossy. Do not add input methods the game does not need.

Output Format

Start with a 3–5 line executive summary: the input methods supported in practice, the most damaging input defect, measured press-to-feedback delay, and the first fix.

Action map:

Action Touch Keyboard and mouse Gamepad Recognised on press or release Guard that can reject it Feedback on reject

Input path timings:

Action Method Hops from event to effect Frames or ms to first feedback How measured

Findings:

Severity Confidence File and line or sequence Problem What the player experiences Fix

Thresholds and forgiveness: current values and proposed values, with the reason.

Platform conflicts: each system or browser behaviour, whether it interferes, and the setting that controls it.

Verify after: the edge sequences replayed on each device and method, and the timings re-measured.

Questions for the owner: which input methods are officially supported, and how forgiving the game is meant to feel.

Want this applied to a live stack?

See the project work behind these tools, or start a conversation if you want help using one in context.

View the prompt source as JSON