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

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