【问题标题】:Seems something is wrong when trying to set requestPointerLock()尝试设置 requestPointerLock() 时似乎有问题
【发布时间】:2013-11-08 08:38:41
【问题描述】:

我的代码似乎有问题,但我不知道是什么。我正在尝试调用 pointerlockchange api 来禁用指针并将鼠标用作 fps 控制器。问题是总是触发 pointerlockerror 并且我收到 Error setting pointer lock! 消息。

函数在 $(document).ready 内部调用。代码如下:

function initLock() {
var havePointerLock = 'pointerLockElement' in document || 'mozPointerLockElement' in document || 'webkitPointerLockElement' in document;

if ( havePointerLock ) {
    var element = document.body;
    console.log('Cathing element', element);
    var pointerlockchange = function ( event ) {
        if ( document.pointerLockElement === element || document.mozPointerLockElement === element || document.webkitPointerLockElement === element ) {
            controls.enabled = true;
            console.log('Pointer lock enabled!')
        } 
        else {
            controls.enabled = false;
        }
    }

    var pointerlockerror = function ( event ) {
        console.log('Error setting pointer lock!');
    }

    // Hook pointer lock state change events
    document.addEventListener( 'pointerlockchange', pointerlockchange, false );
    document.addEventListener( 'mozpointerlockchange', pointerlockchange, false );
    document.addEventListener( 'webkitpointerlockchange', pointerlockchange, false );

    document.addEventListener( 'pointerlockerror', pointerlockerror, false );
    document.addEventListener( 'mozpointerlockerror', pointerlockerror, false );
    document.addEventListener( 'webkitpointerlockerror', pointerlockerror, false );


    // Ask the browser to lock the pointer
    element.requestPointerLock = element.requestPointerLock || element.mozRequestPointerLock || element.webkitRequestPointerLock;

    if ( /Firefox/i.test( navigator.userAgent ) ) {
        var fullscreenchange = function ( event ) {
            if ( document.fullscreenElement === element || document.mozFullscreenElement === element || document.mozFullScreenElement === element ) {
                document.removeEventListener( 'fullscreenchange', fullscreenchange );
                document.removeEventListener( 'mozfullscreenchange', fullscreenchange );
                element.requestPointerLock();
            }
        }

        document.addEventListener( 'fullscreenchange', fullscreenchange, false );
        document.addEventListener( 'mozfullscreenchange', fullscreenchange, false );

        element.requestFullscreen = element.requestFullscreen || element.mozRequestFullscreen || element.mozRequestFullScreen || element.webkitRequestFullscreen;
        element.requestFullscreen();
    } 
    else {
        element.requestPointerLock();
    }
} 
else {
    console.log('Sorry, pointer lock cannot be set.');
}

}

【问题讨论】:

    标签: javascript google-chrome webkit


    【解决方案1】:

    我自己找到了解决方案。问题是 requestPointerLock 不能被自动调用,它应该从用户的回调中调用,例如点击某个东西时。

    【讨论】:

    • 如果用户接受了全屏请求(w3c.github.io/pointerlock),您可以直接调用requestPointerLock()。但是,我发现 FF 和 Chrome (Ubuntu) 在后续调用 exitPointerLock()requestPointerLock() 方面存在差异。 FF 实现似乎接近 W3C 规范。
    猜你喜欢
    • 2016-10-22
    • 2011-03-14
    • 1970-01-01
    • 2022-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多