Pointer Lock API

Pointer Lock API 提供了基于鼠标移动随着时间的增量。

是3D游戏最常见的方式,你可以通过鼠标来控制视角,消除了在一个方向上的移动限制。

基本概念

指针锁定和 鼠标捕获有关。鼠标获指的是当鼠标拖动的时候持续发送事件,但是当鼠标按钮被放开时它就会停止。

指针锁定相较鼠标捕获在以下方面有所不同:

  • 持久性。指针锁定不会释放鼠标,直到有一个明确的 API 调用或是用户使用一个专门的释放方法。
  • 不局限于浏览器或者屏幕边界。
  • 持续发送事件,而不管鼠标按钮状态。
  • 隐藏光标。

Function/Properties

requestPointerLock()

Pointer Lock API 通过添加一个新方法扩展了 dom元素 requestPointerLock()


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

    element.requestPointerLock();
    

目前requestPointerLock()的实现和requestFullScreen以及Fullscreen API紧紧地绑在一起的。

保证在指针锁定之前进入了全屏模式。锁定指针的过程是异步。

使用pointerlockchangepointerlockerror事件表示请求成功或是失败了。

pointerLockElement/exitPointerLock()

Pointer Lock API 也扩展了 Document接口,添加了新的属性和方法。

新的属性被用来访问当前绑定的元素,并将元素命名为pointerLockElement


    document.pointerLockElement = document.pointerLockElement || document.mozPointerLockElement || document.webkitPointerLockElement;

    1.pointerLockElement可以用来确定是否有被指针锁定的元素

    if(document.pointerLockElement){

       }else {

    }

    2.pointerLockElement用来获取被指针锁定的元素

    if (document.pointerLockElement === someElement) {

       }

    

新的方法用来退出指针锁定

requestPointerLock()一样也是异步的,使用pointerlockchangepointerlockerror事件表示请求成功或是失败了。


    document.exitPointerLock = document.exitPointerLock || document.mozExitPointerLock || document.webkitExitPointerLock;

    document.exitPointerLock();
    

pointerlockchange

当指针状态发生变化的时候。如requestPointerLock()exitPointerLock()时会触发pointerlockchange事件。这是一个简单事件所以不包含任何的额外数据。

  • Chromewebkitpointerlockchange
  • Firefoxmozpointerlockchange

pointerlockerror

当存在因调用错误requestPointerLock()或者exitPointerLock(),会触发pointerlockchange事件。这是一个简单事件所以不包含任何的额外数据。

  • Chromewebkitpointerlockerror
  • Firefoxmozpointerlockerror

鼠标事件扩展

Pointer lock API 使用 movement 属性扩展了标准的MouseEvent

movementXmovementY提供了鼠标在XY轴位置变化

锁定状态

当指针锁定被启动之后,正常的 MouseEvent 属性clientX, clientY, screenX, 和 screenY ,保持不变,就像鼠标没有在移动一样。 movementX 和 movementY 属性持续提供鼠标的位置变化。如果鼠标在一个方向上持续移动,movementX 和 movementY的值是没有限制的。不存在鼠标光标的概念,而且光标无法移到窗口之外,而且也不会被屏幕边缘所固定。

未锁定状态

无论鼠标锁定状态是怎样的,movementXmovementY 参数一直有效,并且为了方便起见,甚至在未锁定状态也是有效的。

当鼠标被解除锁定,系统光标可以退出并重新进入浏览器窗口。如果发生这种情况,movementX 和 movementY 可能会被设置成0。

iframe 的限制

指针锁定一次只能锁定一个 iframe。如果你锁定了一个 iframe,你不能试图锁定另外一个 iframe 然后把目标转移到这个 iframe 上;指针锁定将会出错。为了避免这一问题,首先解锁那个锁定的 iframe,然后再锁定另外一个。

iframe 默认的情况下, sandboxed iframes 会阻止指针锁定。避免这种限制的能力,即以属性/值 <iframe sandbox="allow-pointer-lock"> 组合的形式 , 有望很快在 Chrome 中出现。

原文地址:https://www.cnblogs.com/chenjy1225/p/9661328.html

时间: 2024-10-20 02:43:10

Pointer Lock API的相关文章

Pointer Lock

Pointer Lock API 指针锁定(以前叫做 鼠标锁定) 提供了一种输入方法,这种方法是基于鼠标随着时间推移的运动的(也就是说,deltas),而不仅是鼠标光标的绝对位置.通过它可以访问原始的鼠标运动,把鼠标事件的目标锁定到一个单独的元素,这就消除了鼠标在一个单独的方向上到底可以移动多远这方面的限制,并从视图中删去光标. 这个 API 对于需要大量的鼠标输入来控制运动,旋转物体,以及更改项目的应用程序来说非常有用.对高度视觉化的应用程序尤其重要,例如那些使用第一人称视角的应用程序,以及

HTML5 game engines

The following are few examples of game engines implemented with HTML5 and JavaScript: Construct 2: One of the first WebGL enabled HTML5 game engines. Exports purely to HTML5 and JavaScript. Uses Canvas only and is extensible with JavaScript plugins.

Lock的实现之ReentrantLock详解

摘要 Lock在硬件层面依赖CPU指令,完全由Java代码完成,底层利用LockSupport类和Unsafe类进行操作: 虽然锁有很多实现,但是都依赖AbstractQueuedSynchronizer类,我们用ReentrantLock进行讲解: ReentrantLock调用过程 ReentrantLock类的API调用都委托给一个内部类 Sync ,而该类继承了 AbstractQueuedSynchronizer类: public class ReentrantLock impleme

JUC之Lock、ReentrantLock可重入独占锁

前言 ReentrantLock即可重入锁,实现了Lock和Serializable接口 在java环境下ReentrantLock和Synchronized都是可重入锁 ReentrantLock构造函数中提供两种锁:创建公平锁和非公平锁(默认) ReentrantLock有三个内部类 Sync.NonfairSync和FairSync类. Sync继承AbstractQueuedSynchronized抽象类 NonfairSync(非公平锁)继承Sync抽象类. FairSync(公平锁)

安卓性能优化手册

本手册适合至少有初级经验的开发者查阅或复习相关知识使用,新手可能会看不懂. 1.java代码优化 1.1安卓如何执行代码 dvm:.java->.class->.dex->.apk 优化斐波那契数列: 斐波那契数列的递推公式是f(n)=f(n-1)+f(n-2),特征方程为:x2=x+1,解该方程得(1+sqrt(5))/2,(1-sqrt(5))/2.所以f(n)=Ax1n+Bx2n,带入f(0)=0,f(1)=1得A=sqrt(5)/5,B=-sqrt(5)/5.则f(n)求出. B

对于Microsoft Edge的开发者视角

Microsoft Edge一开始是作为IE的补充,但后来为了试图打破过去和遗留的互联网技术就被考虑为单独发展.微软表示他们想通过提升性能.安全性.可靠性以及减少代码复杂性获得比其他现代浏览器更好的互操作性. Edge将通过不同的形式因素.输入类型.鼠标.触摸以及触控笔运行在所有Windows设备上.虽然为了旧版软件微软决定在Windows 10中保留IE,但主要的浏览器依旧是Edge.微软建议开发者仅仅将Edge作为新项目的开发对象. 现在这里有两个Chakra二进制文件:(jscript9.

HTML5 Device Access (设备访问)

camera api (含图片预览) 参考地址 主要为利用input type=file, accept="image/*" 进行处理 图片预览方式(两种) const file = e.target.files[0] // 方式1 const url1 = window.URL.createObjectURL(file); let url2 // 方式2 const reader = new FileReader(); reader.onload = (e) => { url2

WPF 后台模拟界面触摸点击

win32Api提供一种方法,模拟用户触摸点击 InjectTouchInput function InitializeTouchInjection InjectTouchInput 在模拟添加触摸输入(InjectTouchInput)前,需要提前初始化(InitializeTouchInjection) 1 /// <summary> 2 /// Use this Classes static methods to initialize and inject touch input. 3

唤醒锁WakeLock

应用程序耗电的实质,是所启用的硬件在消耗电量.  手机的耗电单元 CPU: 应用处理器(AP)和基带处理器(BB或BP) GPU(图形处理单元) 外设:wifi,BT, GPS,LCD等 AP是ARM架构的处理器,用于运行Android系统: BP用于运行实时操作系统(RTOS),通讯协议栈运行于BP的RTOS之上. 耗电量对比: BP非通话时间的能耗基本上在5mA左右; 而AP只要处于非休眠状态,能耗至少在50mA以上,执行图形运算时会更高, 另外 LCD, WIFI等更高. 一般手机待机时,