我知道即使在keypress
上也有Window
,如果您按住该键,它会重复,但在重复开始之前会有这种轻微的暂停。我不希望这个停顿。我正在写一个游戏,我希望玩家立即做出反应,而不是暂停后。
处理基于网络的游戏的键盘事件的首选方法是什么?
答案 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)
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);