繁体   English   中英

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

[英]How to listen to repetitive keyboard input without pauses on JavaScript/HTML5?

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

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

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

但:

不要只做以下事情:

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是否有所需的键。
作为一个额外的好处,他们键有一个时间戳,它是第一次按下时,如果你想添加充电镜头,或按住按钮跳得更高。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM