2013-01-21 83 views
4

那么,当你按住键盘上的一个键时,在第一次点燃之后会有1秒的延迟。
您可以继续打开记事本并按住一个键(e.x'x'),您会在第一次触发后看到延迟。删除JavaScript中的keydown延迟?

不过,我想开发HTML5画布游戏使用JavaScript,这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; 
    } 
} 

感谢提前:)

+1

有一个简单的解决方案:不要依赖于OS重复,推出自己的事件循环投票键盘类(可选:仅当有事情发生)。 –

+0

@JanDvorak是的,我得到了,谢谢:) – Israelg99

回答

3

,你可以在​​启动事件和停止它keyup

$('#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 } 
+0

它应该如何帮助?如果用户将握住一把钥匙,则按键事件甚至不会起火。 – Israelg99

+1

@IsraelG。那么事件('setInterval')应该无限期地运行。 –

+2

是不是这个想法?你想摆脱延迟,对吧?如果是这样的话,开始一个事件,将运行,直到keyup – Jason

1

相反,听当按键是先按,然后听取它何时发布。这也意味着你必须记录当前的移动速度状态,你可以在这些事件之间应用它。

本例只会服务器向前走,应该很容易扩展到其他方向。

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,总是最终会有一个onkeyup。你需要做的就是在这些事件之间以不同的方式更新事物。

1

你很幸运,我只是为游戏编码。

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") 
})