Javascript несколько клавиш нажата - PullRequest
6 голосов
/ 19 декабря 2011

поэтому сейчас я использую функцию, которая установит значение в 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 ]

7 голосов
/ 19 декабря 2011

Предполагая, что у вас есть какой-то "игровой цикл", похожий на следующие работы (или, может быть, я должен сказать "должен работать", поскольку я давно не кодировал что-то подобное и поэтому не проверял это с текущими браузерами - определенно используется для работы):

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();
2 голосов
/ 19 декабря 2011
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;
}
2 голосов
/ 19 декабря 2011

Я бы посоветовал вам использовать 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);

Таким образом, вы всегда можете проверить этот массив на наличие нажатых клавиш.

...