複数のキーが押されたJavascript

だから私は、あるキーが押されている場合は値を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)

それは、2番目のキーが押されていれば、最初のキーがまだダウンしていなければならないことを確かめることができるようにしたいのです。誰かがただちにもう一方を押すだけで、両方が同時に押された場合、

何か案は?

6
私はウェブブラウザが複数のキープレスをサポートしているとは思わない。
追加された 著者 Ry-,
@minitech - 私はキーダウンとキーアップイベントを使用してキーがダウンしているテーブルを維持し、一度に複数のキーで正常に動作する単純なゲームを実装しました。
追加された 著者 nnnnnn,

3 答え

次のような "ゲームループ"を持っていると仮定します(あるいは、私はこのようなコードを長い間コード化しておらず、現在のブラウザではテストしていないという点で、 - 間違いなく働いていました):

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();
7
追加された
皆さん、ありがとうございました。特にnnnnnnありがとうございました。私が必要としていたものを正確に手伝ってくれました。あなたのプロセスは非常に簡潔で効率的です。あなたは素晴らしいです:D:D; D
追加された 著者 Feng Huo,

キーの状態を保持するために 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
追加された
私は配列ではなくオブジェクトを提案します。したがって、 keyStates = {} 、次に keyStates [e.keyCode] = true;キーダウンハンドラとキーアップハンドラでは、コードの他の部分で if(keyStates ["39"]){} .indexOf()および .splice()よりも簡単で簡単です。
追加された 著者 nnnnnn,
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
追加された
エレガント。私はこれが好き。 +1
追加された 著者 totallyNotLizards,
JavaScript - 日本のコミュニティ
JavaScript - 日本のコミュニティ
2 参加者の

日本人コミュニティのjavascript