JavaScript多个按键同时按下

6

目前我正在使用一个功能,如果其中一个键被按下,另一个键也被按下,无论第一个键是否仍被按下,就会将一个值设置为 true。

 function doc_keyUp1(e) {
      if (e.keyCode == 37){
        lPunch = true 
      }
  }
  function doc_keyUp2(e) {
      if (e.keyCode == 39){
        rPunch = true
      }
  }
  document.addEventListener('keyup', doc_keyUp1, false)
  document.addEventListener('keyup', doc_keyUp2, false)

事情是这样的,我希望它能够确保第二个键被按下时,第一个键必须仍然按下,这样就不会出现有人只是快速按下一个键再按下另一个键,使其看起来就像两个键同时被按下一样。
有任何想法吗?

我认为网络浏览器不支持多个按键同时按下。 - Ry-
@minitech - 我已经实现了一个简单的游戏,使用keydown和keyup事件来维护哪些键被按下,并且它可以同时处理多个键,效果良好。 - nnnnnn
3个回答

7

假设您有某种“游戏循环”,类似以下内容可以使用(或者我应该说“应该工作”,因为我已经很长时间没有编写过这样的代码,所以还没有在当前浏览器中进行测试-肯定曾经可以工作):

var keyPressed = {};

document.addEventListener('keydown', function(e) {
   keyPressed[e.keyCode] = true;
}, false);
document.addEventListener('keyup', function(e) {
   keyPressed[e.keyCode] = false;
}, false);

function gameLoop() {
   if (keyPressed["39"] && keyPressed["37"]) {
      // do something (update player object state, whatever)
   }
   // etc
   // update display here
   setTimeout(gameLoop, 5);
}

gameLoop();

感谢大家的回复。特别感谢 nnnnnn,你帮我提供了我需要的东西,而且你的过程非常简洁高效。你们太棒了 :D :D ;D - Riveascore

2

我建议您使用一个数组来保存键盘状态。

var keyStates = [ ];

document.addEventListener('keydown', function(e) {
    keyStates.push( e.keyCode );
}, false);

document.addEventListener('keyup', function(e) {
    var pos = null;

    if( (pos = keyStates.indexOf( e.keyCode )) > -1 )
        keyStates.splice( pos, 1 );
}, false);

因此,您始终可以检查该数组当前正在被推入的键。


1
我建议使用对象而不是数组。所以 keyStates = {} 然后在 keydown 和 keyup 处理程序中使用 keyStates[e.keyCode] = true; // 或 false,在代码的其他部分使用 if (keyStates["39"]) {}。比 .indexOf().splice() 更快更简单。 - nnnnnn

2
var currentKeyCodes=new Object();

function keyDown(e) {
    currentKeyCodes['x'+e.keyCode]=true;
}

function keyUp(e) {

    //Real check here
    if ((e.keyCode==39) && currentKeyCodes['x37']) {
        do_whatever_you_want();
    }

    //Housekeeping
    var s='x'+e.keyCode;
    if (currentKeyCodes[s]) currentKeyCodes[2]=false;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接