Ho implementato il supporto per il gamepad con JavaScript
Ho trascorso un intero weekend a fare reverse-engineering dell'input del controller per un gioco via browser. Ero lì alle 2 del mattino a fissare un array vuoto. Non appariva nulla.
Quell'esperienza mi ha insegnato più sulle API del browser e sul polling dell'hardware che qualsiasi tutorial.
Il gaming sul web è in crescita. Grazie a WebGL e WebGPU, i giochi per browser raggiungono ora livelli di alta qualità. I giocatori si aspettano di collegare un controller Xbox o PS5 e vederlo funzionare immediatamente.
Se sviluppi giochi, strumenti di accessibilità o dashboard personalizzate, hai bisogno dell'HTML5 Gamepad API. Funziona su Chrome, Firefox ed Edge. Non richiede librerie.
Ecco cosa ho imparato:
- L'API è basata su eventi per le connessioni, ma basata su polling per l'input.
- Devi usare
requestAnimationFrameper leggere l'input continuamente. - I browser non mostreranno un controller finché l'utente non preme un pulsante. Si tratta di una funzione di privacy per prevenire l'hardware fingerprinting.
Gestire i dati:
- Usa
gamepad.mappingper verificare un layout "standard". La mappatura standard assicura che il pulsante 0 sia sempre il pulsante frontale inferiore. - Controlla
gamepad.idper i Vendor e Product ID. Questo ti aiuta a identificare hardware specifici come un Sony DualSense. - Implementa sempre un filtro deadzone. Le levette analogiche non sono mai perfettamente centrate. Senza una deadzone, il tuo personaggio o la telecamera subiranno un drift costante.
Un modo semplice per gestire le deadzone:
Se Math.abs(axis) > 0.1, allora usa il valore.
Feedback aptico:
Puoi usare gamepad.vibrationActuator.playEffect per attivare la vibrazione. Funziona bene in Chrome ed Edge. Firefox ha un supporto parziale. Safari non lo supporta.
Punti chiave per il tuo progetto:
- Ascolta gli eventi
gamepadconnectedegamepaddisconnected. - Monitora gli stati precedenti dei pulsanti per distinguere tra una "pressione" (press) e una "tenuta" (hold).
- Usa una soglia di deadzone per ignorare i minimi movimenti della levetta.
- Testa su più browser.
- Ricorda che
navigator.getGamepads()restituisce uno snapshot. Devi chiamarlo all'interno del tuo loop per ottenere dati aggiornati.
Se vuoi testare il tuo hardware prima di scrivere il codice, usa GamepadTester.pro. Ti mostra i dati grezzi dell'API e i valori degli assi in tempo reale.
