删除JavaScript中的按键延迟?
嗯,当你按住键盘上的一个键时,第一次开火后会有1秒的延迟删除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(
你可以继续,打开记事本,按住一个键(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是的,我知道了,谢谢:)