JS Pointer Lock
JS Pointer Lock
我在指针锁定时遇到问题。我的代码看起来像这样...
Canvas = document.createElement('canvas');
...(Parameters)...
document.body.appendChild(Canvas);
Canvas.requestPointerLock = Canvas.requestPointerLock ||
element.mozRequestPointerLock ||
element.webkitRequestPointerLock;
Canvas.requestPointerLock();
当我运行我的代码时,指针锁没有任何反应(其他一切都以noram方式运行)。我展示的代码正是我认为与问题相关的代码,但如果需要我的程序中的更多代码,请告诉我。
如果我们在点击事件中移动"requestPointerLock()",它工作正常。分享以下示例代码以供参考。
<!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>
根据pointerlock
上的WC3文档:
requestPointerLock
如果用户已通过默认解锁用户手势退出指针锁定,或者以前未为此文档输入指针锁定,则文档必须接收由参与手势生成的事件,然后
requestPointerLock
才会成功。
然后,它将在下面讨论订婚手势。
订婚手势
用户代理作为旨在与页面交互的用户交互的结果生成的事件。 例如
click
,但不是mousemove
。订婚手势是允许显示弹出窗口的定义中包含的任何事件,并添加了keypress
和keyup
。
因此,为了使代码正常工作,应从参与手势(例如click
事件处理程序)调用requestPointerLock
。
相关文章:
- JS Pointer Lock
- A JS Combination Lock
- 如何使用Google Analytics跟踪Caps Lock用户
- Auth0 Lock没有触发鉴权回调功能
- 我如何检测如果CAPS LOCK状态是活跃的,不按任何键使用JS
- js-ctypes: Pointer to intptr_t
- 无法设置规则"pointer-events"通过JS或jQuery
- 一个只有CSS的带有*pointer*的框
- 检测CAPS LOCK是否开启
- pointer-events的用法:none;使用HTML CANVAS
- 为什么是文档.受pointer-events影响的elementFromPoint:无
- 试图获得表行计数值,但得到错误转换结果java.lang.NullPointerException: lock == n