Quick answer: Older XInput controllers reporting drift even at rest, leaking into gameplay? Default deadzone constants are a starting point — ship user-configurable deadzone for aging hardware.
An older Xbox controller has worn stick hardware; in-game character drifts left. The default deadzone isn’t enough.
Default Constants
XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE = 7849 (~24% of full range). Reasonable for fresh hardware; aged controllers may drift past this.
Player Settings Slider
Expose a Deadzone slider in settings (0 - 30%). Players with drift can crank it up; tight-control players keep it low.
Radial Deadzone
float magnitude = std::sqrt(x*x + y*y);
if (magnitude < deadzone) magnitude = 0;Radial (circular) deadzone feels more natural than axis-aligned. Beyond deadzone, rescale magnitude to 0..1.
Calibration Helper
Auto-detect drift on game start: sample stick values for 1 second at rest, set deadzone slightly above max observed. Players don’t need to think about it.
Verifying
Aged controllers feel responsive without drift in gameplay. Sensitivity-tuned for player preference via settings.
“Default deadzone fails aged hardware. Ship user-adjustable + auto-detection.”
Add deadzone calibration to the controller-onboarding flow — one quick wiggle and the game auto-tunes for that player’s hardware.