Javascript多个按键郁闷

时间:2011-12-19 00:48:48

标签: javascript html5 key-bindings

所以现在我正在使用一个函数,如果按下一个键,将一个值设置为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)

问题是,我希望能够确保如果第二个按键被按下,第一个按键仍然必须按下,这样有人就不能只按一个然后快速按下另一个按键看起来好像他们都被同时按下了。

有什么想法吗?

3 个答案:

答案 0 :(得分: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();

答案 1 :(得分:2)

我建议您使用Array来保存关键状态。

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);

因此,您可以随时检查该数组中当前正在推送的键。

答案 2 :(得分: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;
}