
Sentado Ă mesa, vocĂȘ usa o mouse e o teclado enquanto estĂĄ sentado no sofĂĄ - provavelmente o touchpad de um laptop ou a tela de toque de um tablet. VocĂȘ pode atĂ© usar o Leap Motion e controlar seu computador com gestos. Como vocĂȘ jĂĄ entendeu, existem muitas maneiras de navegar na Internet e gerenciar seu computador. Um gamepad pode ser um deles.
Neste artigo, compartilharei com vocĂȘ como:
- conecte o gamepad ao navegador
- ouvir eventos do gamepad
- controlar o foco nos elementos da pĂĄgina usando um gamepad
- faça feedback na forma de vibração
Conecte seu gamepad usando USB ou Bluetooth e vamos começar.
API do Gamepad
Um gamepad da API foi adicionado ao padrão HTML 5. A API permite o uso de gamepads em um navegador. Em combinação com um elemento, essa API pode ser usada para criar jogos que suportam um gamepad. Portanto, os usuårios podem jogar usando o gamepad diretamente no navegador, o que é muito legal. Mas a API pode ser usada não apenas para jogos. Ninguém o impede de criar um dispositivo de entrada na forma de um gamepad para finalidades completamente diferentes.
A API do Gamepad Ă© bem suportada , mas ainda estĂĄ em fase de rascunho. Talvez algo mude, seja excluĂdo ou adicionado no futuro.
NĂłs conectamos um gamepad
Quando o gamepad se conecta ao computador usando USB ou Bluetooth, podemos usar dois eventos para lidar com conexÔes e desconexÔes:
window.addEventListener('gamepadconnected', function(event) {
O gamepad começarĂĄ a funcionar somente depois que vocĂȘ pressionar o botĂŁo (aprox. Traduzir Qualquer ou Iniciar). O fato Ă© que essa Ă© a segurança / privacidade do navegador. Portanto, Ă© necessĂĄrio refletir sobre a interface informando o usuĂĄrio sobre a necessidade de pressionar um botĂŁo para iniciar o trabalho.
Os eventos do gamepad sĂŁo os seguintes no console:

Layout do gamepad: botÔes e eixos
Como vocĂȘ pode ver, o log de eventos possui vĂĄrios botĂ”es (0 - 16) e eixos (eixos 0 - 3). Mas como vocĂȘ sabe como os botĂ”es se escondem atrĂĄs do nĂșmero? Os gamepads tĂȘm layouts diferentes, dependendo da marca. Portanto, vocĂȘ deve procurar informaçÔes na Internet. Nesse caso, conectamos o gamepad do Xbox One e ele tem este layout:

Ouça o pressionamento de tecla
Ao desenvolver interfaces, vocĂȘ pode usar .addEventListener()
para adicionar um evento ao pressionamento de tecla. Nesse caso, isso nĂŁo pode ser feito, pois os botĂ”es no controlador nĂŁo criam eventos. E como vocĂȘ pode ver no log acima, vocĂȘ deve verificar o campo pressed
manualmente:
const xBoxButtonB = gamepad.buttons[1] if (xBoxButtonB.pressed) { doSomethingOnButtonPress(); }
Como queremos fazer a verificação o tempo todo, precisamos agrupar tudo em um loop. Por exemplo, usando requestAnimationFrame
:
const rAF = window.mozRequestAnimationFrame || window.requestAnimationFrame; window.addEventListener('gamepadconnected', function() { updateLoop(); }); function updateLoop() {
Navegação entre itens
Para usar o gamepad para navegar na pĂĄgina da web, vocĂȘ deve simular o teclado. Mas primeiro vocĂȘ precisa obter todos os elementos da pĂĄgina que podem ser focados.
Usando o seletor a seguir, vocĂȘ pode obter todos esses elementos:
const focusableElements = document.querySelectorAll( 'button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])' );
Movendo o foco programaticamente
Para focar no elemento, percorreremos o NodeList
e focaremos no elemento atual usando o método element.focus()
.
Este exemplo mostra como vocĂȘ pode pular o foco de um elemento para outro:
let current; function updateLoop() { const gamepad = navigator.getGamepads()[0] const gamepadBumperL = gamepad.buttons[4] const gamepadBumperR = gamepad.buttons[5] if (gamepadBumperL.pressed) { prevItem(current) } if (gamepadBumperR.pressed) { nextItem(current) } setTimeout(() => rAF(updateLoop), 100) } function prevItem(index) { current = (index - 1) % focusableElements.length focusableElements[current].focus() } function nextItem(index) { current = (index + 1) % focusableElements.length focusableElements[current].focus() }
Preste atenção ao uso da função setTimeout
. Ă usado para limitar requestAnimationFrame
a 100 milissegundos. Sem isso, um Ășnico clique em uma tecla pode gerar vĂĄrios eventos do gamepad, jĂĄ que nĂŁo existe um onClick familiar para nĂłs e Ă© fisicamente impossĂvel pressionar e soltar uma tecla em um milissegundo.
Clique nos elementos
VocĂȘ pode click()
nos elementos usando o método click()
:
clickItem(index) { focusableElements[index].click(); }
Adicione feedback usando vibração
Gamepads modernos podem vibrar. Essas vibraçÔes sĂŁo usadas para feedback do usuĂĄrio, geralmente em jogos. Mas vocĂȘ tambĂ©m pode tentar obter feedback dos elementos da web na pĂĄgina.
Os gamepads geralmente são equipados com dois motores elétricos, potentes e fracos:

Podemos controlar esses motores em um navegador usando o vibrationActuator
.
Para criar vibração, podemos usar o método playEffect()
:
gamepad.vibrationActuator.playEffect('dual-rumble', { startDelay: 0,
Ao usar motores para vibração, lembre-se de que um motor grande precisa de mais tempo para acelerar. Portanto, para respostas de curto prazo, é melhor usar um pequeno motor.

ConclusĂŁo
Neste exemplo, examinamos as funçÔes båsicas da API do Gamepad e como ela pode ser usada para navegar na Internet.
O código e a demonstração do GitHub podem ser vistos aqui .
Links Ășteis
html5gamepad.com - ferramenta de verificação de gamepad
API do Gamepad no MDN