Navegar na Internet com um Gamepad (Javascript)


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) { // , -   console.log(event) }); window.addEventListener('gamepaddisconnected', 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() { //    rAF(updateLoop); } 


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, // Add a delay in milliseconds duration: 1000, // Total duration in milliseconds weakMagnitude: 0.5, // intensity (0-1) of the small ERM strongMagnitude: 1 // intesity (0-1) of the bigger ERM }); 

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

Source: https://habr.com/ru/post/pt485562/


All Articles