Gamepad input source.
Drawn at each cursor position via CanvasRenderingContext2D.drawImage. The image's top-left is the draw origin — center the visible reticle inside the image, or offset the anchors to compensate.
Anchor positions, one per stick to track. Cloned at construction so caller mutation is harmless.
Max pixel deflection from anchor at full stick. Default 80.
Draw a crosshair at anchor + offset for each tracked stick.
Pull fresh stick state via Controller.poll and smooth each crosshair's offset toward stickAxis * range. Frame-rate independent — 50 ms to cover half the remaining distance.
On-screen crosshairs driven by a Controller's analog sticks. Each anchor in
sticksgets its own crosshair that follows the corresponding stick's deflection with frame-rate-independent exponential smoothing (50 ms half-life). The caller owns the anchor positions and the crosshair image — anyCanvasImageSourceworks (a loadedHTMLImageElement, a procedurally-drawnHTMLCanvasElement, anImageBitmap, …).update polls the controller for you; don't call Controller.poll again from the same
updatestep.