如何在JavaScript/HTML5上不停顿地收听重复的键盘输入?

如何在JavaScript/HTML5上不停顿地收听重复的键盘输入?,javascript,html,Javascript,Html,我知道即使在窗口上也有这个按键,如果你按住键,它会重复,但在重复开始之前会有一个轻微的停顿。我不想这样停顿。我正在写一个游戏,我希望玩家立即做出反应,而不是在停顿之后 对于基于web的游戏,处理键盘事件的首选方式是什么?就像Steve说的,这是不可能的。 您应收听keydown/keyup事件,并跟踪按下的按钮: var pressedKeys = {}; $(window) .bind("keydown", function(e) { pressedKeys[e.key

我知道即使在
窗口
上也有这个
按键
,如果你按住键,它会重复,但在重复开始之前会有一个轻微的停顿。我不想这样停顿。我正在写一个游戏,我希望玩家立即做出反应,而不是在停顿之后


对于基于web的游戏,处理键盘事件的首选方式是什么?

就像Steve说的,这是不可能的。 您应收听keydown/keyup事件,并跟踪按下的按钮:

var pressedKeys = {};
$(window)
    .bind("keydown", function(e) {
        pressedKeys[e.keyCode] = true;
    })
    .bind("keyup", function(e) {
        delete pressedKeys[e.keyCode];
    })
;
我认为在游戏中,通常会在某个地方有一个主循环来处理所有这些事件:

setInterval(function() {
    if (pressedKeys[38]) { // if up is pressed
        // do stuff
    }
}, 50);
听“keydown”,而不是“keypress”。 Keydown持续开火,直到你放开为止

但是:

不要只做以下事情:

window.addEventListener("keydown", function (evt) {
    if (evt.keyCode === 32) { player.fire(); }
});
最终,有些人每秒射击15次,有些人每秒射击60次,甚至有些人每秒射击120次

取而代之的是,拥有一个键盘对象,该对象在n事件触发时随时更新自身:

var Keyboard = {
    keys : {},
    keyPress : function (evt) {
        if (this.keys[evt.keyCode] > 0) { return; }
        this.keys[evt.keyCode] = evt.timeStamp || (new Date()).getTime();
    },
    keyRelease : function (evt) {
        this.keys[evt.keyCode] = 0;
    }
};
window.addEventListener("keydown", Keyboard.keyPress.bind(Keyboard));
window.addEventListener("keyup", Keyboard.keyRelease.bind(Keyboard));
然后,在您的更新周期中,让角色检查
键盘
,以找到所需的键。
作为一个额外的好处,他们的键有一个时间戳,当它第一次按下,以防你想添加充电射击,或按住按钮跳得更高

然后,你的部队应该在他们自己的更新区域内记录他们被允许开火的频率,以及最后一次开火的时间