Algunos controladores pueden tener cuatro. Un par de botones frontales, o botones de hombro, como se les llama, en el lado izquierdo y derecho del GamePad. Y un par de joysticks.
Ten en cuenta que, dado que la API de GamePad está en sus primeras etapas, el diseño estándar de los botones del GamePad puede variar de un navegador a otro. La imagen aquí muestra los mapeos de botones predeterminados para Google Chrome.
Entonces, ¿cómo podemos rastrear estos cambios en el estado de los botones? ¿Existen eventos expuestos por la API de GamePad que podamos utilizar? Veamos.
La API de GamePad proporciona el evento GamePad Connected, que se emite cada vez que se conecta un nuevo GamePad al navegador. Si el GamePad ya está conectado, cuando la página se carga y obtiene el enfoque, entonces el evento se emite cada vez que hay alguna actividad en el GamePad, ya sabes, una pulsación de botón o un movimiento en un joystick. De manera similar, hay un evento GamePad Disconnected, que se emite cuando se desconecta un GamePad del navegador.
Sin embargo, no hay una forma estandarizada de detectar las pulsaciones de botones del GamePad o los movimientos del joystick. Ya se ha visto que la interfaz GamePad devuelve información útil sobre los estados de acceso a los botones, pero no hay un evento real que se emita cuando el usuario realiza estas acciones. Actualmente, la API de GamePad solo admite los eventos GamePad Connected y Disconnected.
Entonces, intentemos explorar qué podemos hacer para rastrear los botones del GamePad, las pulsaciones y los movimientos de acceso. Podríamos tener un GamePad conectado al navegador y, para rastrear los estados de los botones y el acceso, podemos realizar una consulta continua de los cambios en algo como una llamada de intervalo establecido, y esto es lo más simple que podemos hacer. Si observas el código aquí, estamos registrando la información del primer botón del primer GamePad conectado al navegador. Por eso usamos el 0 a X. Esto funciona bien. Podemos capturar el estado del botón a medida que se actualiza, pero esto puede no ser la mejor forma de capturar esta información. Veamos por qué.
Todos sabemos que en JavaScript, todo se ejecuta en un solo hilo y las funciones de temporizador no son una excepción. Para ejecutar código utilizando setInterval, especificamos una devolución de llamada que se ejecuta cada X milisegundos. A veces, los retrasos proporcionados a estas funciones de temporizador no se respetan debido a la ejecución prioritaria de tareas intensivas en recursos, si las hay en la cola de tareas. Y esto conduce a intervalos de retraso inconsistentes. Es posible que hayas notado una interrupción al usar setInterval para animar elementos de la página. Y esto se debe a una actualización innecesaria y forzada de los elementos de la página. Incluso antes de que la pantalla del usuario esté lista para procesar y representar esas actualizaciones. Y esto se llama bloqueo del diseño y se debe evitar a toda costa.
Entonces, ¿qué más podemos hacer aquí? Podemos usar request animation frame. Ahora, la devolución de llamada proporcionada a request animation frame se garantiza que se ejecutará al inicio del fotograma. Lo que significa que la devolución de llamada especificada se llamará antes de que ocurra la próxima operación de repintado.
Comments