如何在没有暂停JavaScript / HTML5的情况下听重复键盘输入?

时间:2012-11-25 15:58:38

标签: javascript html5

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

处理基于网络的游戏的键盘事件的首选方法是什么?

2 个答案:

答案 0 :(得分:6)

听取“keydown”,而不是“按键”。 Keydown不断开火直到你放手。

BUT:

不要只做以下事情:

window.addEventListener("keydown", function (evt) {
    if (evt.keyCode === 32) { player.fire(); }
});

你最终会遇到一些人每秒射击15次,有些人每秒射击60次,甚至可能每秒射击120次。

相反,让一个Keyboard对象在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));

然后,在更新周期中,让角色检查Keyboard是否有所需的密钥 作为一个额外的奖励,他们键有一个时间戳,它是第一次按下时,如果你想添加充电镜头,或按住按钮跳得更高。

然后你的单位应该跟踪他们被允许射击的频率,以及最后一次,在他们自己的更新区域内。

答案 1 :(得分:4)

像史蒂夫说的那样,这是不可能的。 您应该监听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);