Os apps da Web agora podem desativar a aceleração do mouse ao capturar eventos de ponteiro.
O movimento acelerado é um recurso ergonômico usado com mouse ou trackpad para mover o ponteiro na tela. Ele permite movimentos precisos, movendo-se lentamente, ao mesmo tempo que permite que o ponteiro percorra toda a tela com um movimento curto rápido. Especificamente, para a mesma distância física que você move o mouse, o ponteiro na tela se deslocará mais se a distância for percorrida mais rapidamente.
Os sistemas operacionais ativam a aceleração do mouse por padrão. Em alguns jogos de perspectiva própria, geralmente jogos de tiro em primeira pessoa (QPS), os dados brutos de entrada do mouse são usados para controlar a rotação da câmera sem um ajuste de aceleração. O mesmo movimento físico, lento ou rápido, resulta na mesma rotação. Isso resulta em uma experiência de jogo melhor e mais precisão, de acordo com jogadores profissionais.
A partir do Chrome 88, os apps da Web podem alternar entre dados de movimentos de mouse acelerados e não acelerados graças à API Pointer Lock atualizada.
Plataformas de jogos baseadas na Web, como Google Stadia e Nvidia GeForce Now, já usam esses novos recursos para agradar gamers com QPS.
Como usar a API
Solicitar um bloqueio de ponteiro
Um bloqueio de ponteiro é o termo canônico quando um app para computador oculta o ícone de ponteiro e interpreta o movimento do mouse para outra coisa, por exemplo, olhar ao redor em um mundo 3D.
Os atributos movementX
e movementY
dos eventos de documento mousemove
informam quanto o ponteiro do mouse se moveu desde o último evento de movimento. No entanto,
eles não são atualizados quando o ponteiro se move para fora da página da Web.
document.addEventListener("mousemove", (event) => {
console.log(`movementX: ${event.movementX} movementY: ${event.movementY}`);
});
Capturar o ponteiro do mouse (ou solicitar um bloqueio de ponteiro) permite que você não se preocupe mais com o movimento do ponteiro para fora dele. Isso é especialmente útil para jogos imersivos na Web. Quando o ponteiro está bloqueado, todos os eventos de mouse vão para o elemento de destino do bloqueio do ponteiro.
Chame requestPointerLock()
no elemento de destino para solicitar um bloqueio de ponteiro e
detecte eventos pointerlockchange
e pointerlockerror
para monitorar as mudanças de bloqueio
do ponteiro.
const myTargetElement = document.body;
// Call this function to request a pointer lock.
function requestPointerLock() {
myTargetElement.requestPointerLock();
}
document.addEventListener("pointerlockchange", () => {
if (document.pointerLockElement) {
console.log(`pointer is locked on ${document.pointerLockElement}`);
} else {
console.log("pointer is unlocked");
}
});
document.addEventListener("pointerlockerror", () => {
console.log("pointer lock error");
});
Desativar a aceleração do mouse
Chame requestPointerLock()
com { unadjustedMovement: true }
para desativar
o ajuste no nível do SO para aceleração do mouse e acessar a entrada bruta do mouse.
Dessa forma, os dados de movimento do mouse de eventos mousemove
não vão incluir a aceleração
do mouse quando o ponteiro estiver bloqueado.
Use a nova promessa retornada de requestPointerLock()
para saber se a solicitação foi bem-sucedida.
function requestPointerLockWithUnadjustedMovement() {
const promise = myTargetElement.requestPointerLock({
unadjustedMovement: true,
});
if (!promise) {
console.log("disabling mouse acceleration is not supported");
return;
}
return promise
.then(() => console.log("pointer is locked"))
.catch((error) => {
if (error.name === "NotSupportedError") {
// Some platforms may not support unadjusted movement.
// You can request again a regular pointer lock.
return myTargetElement.requestPointerLock();
}
});
}
É possível alternar entre dados de movimentos do mouse acelerados e não acelerados sem liberar o bloqueio do ponteiro. Basta solicitar o bloqueio do ponteiro novamente com a opção desejada. Se essa solicitação falhar, o bloqueio original permanecerá intacto e a promessa retornada será rejeitada. Nenhum evento de bloqueio de ponteiro será disparado para uma solicitação de mudança com falha.
Suporte ao navegador
A API Pointer Lock tem suporte em todos os navegadores. No entanto, os navegadores baseados no Chromium (por exemplo, Chrome, Edge etc.) são os únicos que oferecem suporte à desativação do ajuste no nível do SO para aceleração do mouse a partir de outubro de 2020. Consulte as atualizações na tabela Compatibilidade de navegadores do MDN.
Suporte ao sistema operacional
A desativação do ajuste no nível do SO para aceleração do mouse tem suporte no ChromeOS, no macOS Catalina 10.15.1 e no Windows. O Linux virá depois.
Exemplo
Você pode testar a API Pointer Lock executando o exemplo no Glitch. Confira o código-fonte.
Links úteis
- Explicação
- RP da especificação
- Repositório do GitHub
- Entrada ChromeStatus
- Bug de rastreamento do Chrome
- Intenção de envio
- Posição do Mozilla
- Posição do WebKit
Agradecimentos
Agradecemos a James Hollyer, Thomas Steiner, Joe Medley, Kayce Basques e Vincent Scheib pelas avaliações deste artigo.