删除JavaScript中的按键延迟?

删除JavaScript中的按键延迟?,javascript,html5-canvas,dom-events,Javascript,Html5 Canvas,Dom Events,嗯,当你按住键盘上的一个键时,第一次开火后会有1秒的延迟 你可以继续,打开记事本,按住一个键(e.x‘x’),你会看到在第一次开火后有一个延迟 然而,我正试图用JavaScript在HTML5画布上开发一个游戏,1秒的延迟非常烦人,此外,它会停止玩家行走动画 那么,我如何删除JavaScript中令人讨厌的延迟(没有jQuery!) 我的keydown事件在这种模式下工作- document.onkeydown = getKey; function getKey(e) { switch(

嗯,当你按住键盘上的一个键时,第一次开火后会有1秒的延迟
你可以继续,打开记事本,按住一个键(e.x‘x’),你会看到在第一次开火后有一个延迟

然而,我正试图用JavaScript在HTML5画布上开发一个游戏,1秒的延迟非常烦人,此外,它会停止玩家行走动画

那么,我如何删除JavaScript中令人讨厌的延迟(没有jQuery!)

我的keydown事件在这种模式下工作-

document.onkeydown = getKey;
function getKey(e) {
    switch(e.keyCode) {
        case 38: // UP
            Player.PositionY--;
        break;
        case 39: // RIGHT
            Player.PositionX++;
        break;
        case 40: // DOWN
            Player.PositionY++;
        break;
        case 37: // LEFT
            Player.PositionX--;
        break;
    }
}

您可以在
keydown
上启动事件,并在
keydup

$('#mycanvas').on('keydown', function() { 
   $(document).trigger('start'); 
}); 

$('#mycanvas').on('keyup', function() { 
   $(document).trigger('stop'); 
});

$(document).on('start', startAnimation);
$(document).on('stop', stopAnimation);

function startAnimation(e) { //start something }
function stopAnimation(e) { //stop something }

相反,先听按键何时被按下,然后听按键何时被释放。这也意味着您必须记录移动速度的当前状态,以便在这些事件之间应用它

这个示例将只用于向前走的服务器,应该很容易扩展到其他方向

var playerSpeed = 0;

document.onkeydown = keyDown;
document.onkeyup = keyUp;

function keyDown(e) {
    switch(e.keyCode) {
        case 38: // UP
            playerSpeed = 1; // moving!
            break;
        // other cases...
    }
}

function keyUp(e) {
    switch(e.keyCode) {
        case 38: // UP
            playerSpeed = 0; // NOT moving!
            break;
        // other cases...
    }
}

// Whatever loop is called for each frame or game tick
function updateLoop() {
  // rendering, updating, whatever, per frame
  Player.PositionY += playerSpeed;
}

这样,键盘的重复频率就不重要了。每个
onkeydown
,最终都会有一个
onkeydup
。你所要做的就是在这些事件之间以不同的方式更新内容。

你很幸运,我只是为一个游戏编写了这个代码

Controller = {
    keyIsDown: [],

    // Add a new control. up is optional.
    // It avoids key repetitions
    add: function (key, down, up) {
        $(document).keydown(function(e) {
            if(e.keyCode === key && !Controller.keyIsDown[key]) {
                    down()
                Controller.keyIsDown[key] = true
                return false
            }
        })

        $(document).keyup(function(e) {
            if(e.keyCode === key) {
                if(up) up()
                Controller.keyIsDown[key] = false
                return false
            }
        })
    },
}
例如:

Controller.add(65,
    function () {
        console.log("A is down")
    },
    // This argument is optional
    function () {
        console.log("A is up")
})

它应该如何帮助?如果用户持有一个密钥,则keyup事件甚至不会触发..@IsraelG。那么事件(
setInterval
)应该无限期运行。这不是想法吗?你想摆脱拖延,对吗?如果是这样的话,启动一个事件,该事件将一直运行到keyupWhy the extra level of indirection?@JanDvorak OP试图绕过操作系统键盘延迟。这是一种方法。有一个简单的解决方案:不要依赖操作系统的重复,滚动你自己的事件循环来轮询你的键盘类(可选:只有在有事情发生的情况下)。@JanDvorak是的,我知道了,谢谢:)