2011-12-19 12 views
6

今は、あるキーが押されている場合は値をtrueに設定し、最初のキーが押されているかどうかにかかわらず、別のキーが押された場合は値を設定します。Javascript複数のキーが押されている

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) 

事は、私は誰かがちょうどその1を押すことができないように、それは、2番目のキーが押されている場合、最初のものはまだダウンしなければならないことことを確認して持つことができるようにしたいです他の人はすぐにそれを見て、両方が同時に押されたように見せてください。

アイデア?

+0

Webブラウザは複数のキーを押すことはできません。 – Ryan

+0

@minitech - キーダウンが発生したテーブルを維持するためにキーダウンイベントとキーアップイベントを使用したシンプルなゲームを実装しました。 – nnnnnn

答えて

6

その中で私は長い時間ので、避難所のために、このような何かをコーディングしていない、「動作するはずです」以下の作品のようなもの、あなたが「ゲームループ」のいくつかの種類を持っていると仮定すると(または多分私が言うべき現時点のブラウザでテストしたことがありますか?確かに動作していました):

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(); 
+0

お返事ありがとうございました。特にnnnnnnありがとうございました。私が必要としていたものを正確に手伝ってくれました。あなたのプロセスは非常に簡潔で効率的です。あなたは素晴らしいです:D:D; D –

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

このようにして、現在その配列がプッシュされているかどうかを常に確認できます。

+1

私は配列ではなくオブジェクトを提案します。だから 'keyStates = {}'とし、 'keyStates [e.keyCode] = true;キーダウンハンドラや 'if(keyStates [" 39 "]){}'のコードの他の部分では、//かfalseを返します。 '.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; 
} 
+0

エレガント。私はこれが好き。 +1 – jammypeach

関連する問題