3 votes

Verrouillage du pointeur JS

J'ai des problèmes avec le verrouillage des pointeurs. Mon code ressemble à quelque chose comme ceci...

Canvas = document.createElement('canvas');
...(Parameters)...
document.body.appendChild(Canvas);

Canvas.requestPointerLock = Canvas.requestPointerLock ||
             element.mozRequestPointerLock ||
             element.webkitRequestPointerLock;

Canvas.requestPointerLock();

Lorsque j'exécute mon code, rien ne se passe avec le verrouillage du pointeur (tout le reste fonctionne normalement). Le code que j'ai montré est juste ce que je pense être pertinent pour le problème mais si plus de code de mon programme est nécessaire, dites-le moi.

2voto

Nitin Sinha Points 99

Si nous déplaçons 'requestPointerLock()' à l'intérieur de l'événement click, cela fonctionne bien. Partageant l'exemple de code ci-dessous pour référence.

<!DOCTYPE HTML>
<html lang="en-US">
<head>
<meta charset="UTF-8">
<title>Pointer lock</title>

<style type="text/css"> 
html {font-size: 10px; font-family: sans-serif;}
canvas {display: block; margin: 0 auto; border: 1px solid black;}
</style>
</head>

<body>
      <canvas width="640" height="360">
        Your browser does not support HTML5 canvas
      </canvas>
</body>

<script type="text/javascript">
// setup of the canvas

window.addEventListener('load', eventWindowLoaded, false);
var canvas = document.querySelector('canvas');
var ctx = canvas.getContext('2d');

function eventWindowLoaded() {  
  canvasDraw();
}

var x = 50;
var y = 50;

function canvasDraw() { 
  ctx.fillStyle = "black";
  ctx.fillRect(0,0,canvas.clientWidth,canvas.clientHeight);
  ctx.fillStyle = "#f00";  
  ctx.beginPath();
  ctx.arc(x,y,20,0,degToRad(360), true);
  ctx.fill();
}

// pointer lock object forking for cross browser
canvas.requestPointerLock = canvas.requestPointerLock || canvas.mozRequestPointerLock;
document.exitPointerLock = document.exitPointerLock || document.mozExitPointerLock;

canvas.onclick = function() {
  canvas.requestPointerLock();
}

// pointer lock event listeners
// Hook pointer lock state change events for different browsers
document.addEventListener('pointerlockchange', lockChangeAlert, false);
document.addEventListener('mozpointerlockchange', lockChangeAlert, false);

function lockChangeAlert() {
  if(document.pointerLockElement === canvas ||
  document.mozPointerLockElement === canvas) {
    console.log('The pointer lock status is now locked');
    document.addEventListener("mousemove", canvasLoop, false);
  } else {
    console.log('The pointer lock status is now unlocked');  
    document.removeEventListener("mousemove", canvasLoop, false);
  }
}

function canvasLoop(e) {
  var movementX = e.movementX || e.mozMovementX || 0;
  var movementY = e.movementY || e.mozMovementY ||  0;
  x += movementX;
  y += movementY; 
  canvasDraw();
  console.log("X position: " + x + ', Y position: ' + y);
}

// helper function
function degToRad(degrees) {
  var result = Math.PI/180 * degrees;
  return result;
}   
</script>
</html>

2voto

caffinatedmonkey Points 1130

Selon les WC3 Docs on pointerlock :

requestPointerLock

Si un utilisateur a quitté le verrouillage du pointeur via le geste de déverrouillage par défaut de l'utilisateur, ou si le verrouillage du pointeur n'a pas été saisi précédemment pour ce document, un événement généré à la suite d'un geste d'engagement doit être reçu par le document avant que requestPointerLock va réussir.

Il parle ensuite des gestes d'engagement ci-dessous.

Geste de fiançailles

Un événement généré par l'agent utilisateur à la suite d'une interaction de l'utilisateur destinée à interagir avec la page. par ex. click mais pas mousemove . Les gestes d'engagement sont tous les événements inclus dans la définition de l'autorisation d'afficher une fenêtre contextuelle, avec l'ajout des éléments suivants keypress y keyup .

Donc pour que votre code fonctionne, requestPointerLock doit être appelé à partir d'un geste d'engagement, par exemple une click gestionnaire d'événements.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X