Pointer Lock API

作者: lio_zero | 来源:发表于2021-05-28 23:58 被阅读0次

Pointer Lock API 用于提供对原始鼠标移动的访问,将鼠标事件的目标锁定到单个元素,消除鼠标移动在单个方向上的距离限制,并从视图中移除光标。常用在第一人称或实时策略游戏。

以下 Can I Use 对 Pointer Lock API 的支持情况:

Pointer Lock API 的支持情况

方法

通过添加 requestPointerLock 新方法来扩展 DOM 元素。它类似 Fullscreen API,目前使用还需要加上厂商前缀,如:

elem.webkitRequestPointerLock() // Chrome
elem.mozRequestPointerLock() // Firefox

事件

pointerlockchange 事件 — 当指针锁定状态改变时 - 例如,当调用 requestPointerLock, exitPointerLock,用户按下 ESC 键,等等。— pointerlockchange 事件被分发到 document。 这是一个简单事件所以不包含任何的额外数据。

document.addEventListener('pointerlockchange', pointerLockChange)
document.addEventListener('mozpointerlockchange', pointerLockChange)
document.addEventListener('webkitpointerlockchange', pointerLockChange)

pointerlockerror 事件 — 当调用 requestPointerLockexitPointerLock而引发错误时, pointerlockerror 事件被分发到 document。这是一个简单事件所以不包含任何的额外数据。

document.addEventListener('pointerlockerror', pointerLockError)
document.addEventListener('mozpointerlockerror', pointerLockError)
document.addEventListener('webkitpointerlockerror', pointerLockError)

示例

下面是来自 MDN 的示例,你可以在这👉 查看效果

// 我们将要使之全屏并指针锁定的元素。
var elem;

document.addEventListener(
  "mousemove",
  function (e) {
    var movementX = e.movementX || e.mozMovementX || e.webkitMovementX || 0,
      movementY = e.movementY || e.mozMovementY || e.webkitMovementY || 0;

    // 打印鼠标移动的增量值。
    console.log("movementX=" + movementX, "movementY=" + movementY);
  },
  false
);

function fullscreenChange() {
  if (
    document.webkitFullscreenElement === elem ||
    document.mozFullscreenElement === elem ||
    document.mozFullScreenElement === elem
  ) {
    // 较旧的 API 大写 'S'.
    // 元素进入全屏模式了,现在我们可以请求指针锁定。
    elem.requestPointerLock =
      elem.requestPointerLock ||
      elem.mozRequestPointerLock ||
      elem.webkitRequestPointerLock;
    elem.requestPointerLock();
  }
}

document.addEventListener("fullscreenchange", fullscreenChange)
document.addEventListener("mozfullscreenchange", fullscreenChange)
document.addEventListener("webkitfullscreenchange", fullscreenChange)

function pointerLockChange() {
  if (
    document.mozPointerLockElement === elem ||
    document.webkitPointerLockElement === elem
  ) {
    console.log("指针锁定成功了。");
  } else {
    console.log("指针锁定已丢失。");
  }
}

document.addEventListener("pointerlockchange", pointerLockChange)
document.addEventListener("mozpointerlockchange", pointerLockChange)
document.addEventListener("webkitpointerlockchange", pointerLockChange)

function pointerLockError() {
  console.log("锁定指针时出错。");
}

document.addEventListener("pointerlockerror", pointerLockError)
document.addEventListener("mozpointerlockerror", pointerLockError)
document.addEventListener("webkitpointerlockerror", pointerLockError)

function lockPointer() {
  elem = document.getElementById("pointer-lock-element");
  // 开始于使元素进入全屏模式。目前的实现
  // 要求元素在请求指针锁定前要处于全屏模式下
  // -- 这在以后可能会发生改变。
  elem.requestFullscreen =
    elem.requestFullscreen ||
    elem.mozRequestFullscreen ||
    elem.mozRequestFullScreen || // 较旧的 API 把 ‘S’ 大写
    elem.webkitRequestFullscreen;
  elem.requestFullscreen();
}

相关文章

  • Pointer Lock API

    相关背景 痛点:在激烈的射击游戏中切换视角,很容易就把光标移出窗口,游戏就很难进行下去 概念:指针锁定(以前叫做 ...

  • Pointer Lock API

    Pointer Lock API[https://developer.mozilla.org/en-US/docs...

  • HTML5 指针锁定API: Pointer Lock API

    说明 指针锁定(以前叫做鼠标锁定) 是一种输入方法,这种方法是基于指针的相对位移(movement),而不是绝对位...

  • 无锁实现之Hazard Pointer (to be conti

    [TOC] 参考 实现无锁的栈与队列(5):Hazard Pointer Lock-free 编程:A Case ...

  • 2019-09-26

    synchronized和lock Lock是Java 5以后引入的新的API,和关键字synchronized相...

  • 9.Lock锁接口实现

    Lock的核心API lock 获取锁的方法,若锁被其他线程获取,则等待(阻塞) lockInterruptibl...

  • 1.2.4 Lock锁接口实现 -- ReentrantLock

    Lock的核心API 方法描述lock获取锁的方法,若锁被其他线程获取,则等待(阻塞)lockInterrupti...

  • 简述synchronized 和java.util.concur

    Lock是Java 5以后引入的新的API,和关键字synchronized相比主要相同点:Lock 能完成syn...

  • 1.mutex api: pthread_mutex_lock pthread_mutex_unlock pthr...

  • AQS-ReentrantLock

    ReentrantLock:API层面的互斥(lock()和unlock()方法配合try/finally完成)s...

网友评论

    本文标题:Pointer Lock API

    本文链接:https://www.haomeiwen.com/subject/jsaesltx.html