API Pointer Lock Leva jogos QPS para o navegador

Ilmari Heikkinen

A API Pointer Lock foi lançada recentemente no Chrome Canary e no Canal de Desenvolvedor. Vamos comemorar! Espera, o quê? Você não conhece a API Pointer Lock? Em resumo, a API Pointer Lock permite criar jogos de tiro em primeira pessoa para a Web.

A implementação do Chrome permite que uma página da Web em tela cheia peça sua permissão para capturar o ponteiro do mouse, para que você não possa movê-lo para fora da página. Isso permite que os desenvolvedores da Web criem jogos e aplicativos 3D sem se preocupar com o cursor do mouse se movendo para fora da página. Quando o ponteiro está bloqueado, os eventos de movimento do ponteiro têm atributos movementX e movementY definidos que informam quanto o mouse se moveu desde o último evento de movimento. Como de costume com APIs de última geração, esses atributos têm prefixo do fornecedor. Portanto, você precisa usar webkitMovementX e outros semelhantes.

Para ativar a API Pointer Lock nos builds atuais do Chrome, a maneira mais fácil é acessar about:flags e ativar a flag "Enable Pointer Lock". Também é possível ativar esse recurso ao iniciar o Chrome usando a flag de linha de comando --enable-pointer-lock.

Já existem algumas demonstrações legais que aproveitam esse recurso. Confira a demonstração do Quake 3 WebGL (em inglês) de Brandon Jones para saber como a API Pointer Lock torna os jogos de FPS do WebGL uma opção viável. Outra demonstração legal é o Visualizador de ruas do WebGL.

Para começar a usar a API Pointer Lock, confira um pequeno snippet retirado do MDN:

<button onclick="document.body.webkitRequestFullScreen();">No, you lock it up!</button>
<script>
navigator.pointer = navigator.pointer || navigator.webkitPointer;

var onError = function() {
    console.log("Mouse lock was not successful.");
};

document.addEventListener('webkitfullscreenchange', function(e) {
    if (document.webkitIsFullScreen) {
    navigator.pointer.lock(document.body, function() {
        // Locked and ready to play.
    }, onError);
    }
}, false);

document.body.addEventListener('webkitpointerlocklost', function(e) {
    console.log('Pointer lock lost!');
}, false);

document.body.addEventListener('mousemove', function(e) {
    if (navigator.pointer.isLocked) { // got a locked pointer
    var movementX = e.movementX || e.webkitMovementX;
    var movementY = e.movementY || e.webkitMovementY;
    }
}, false);
</script>