2011-12-19 91 views
6

所以現在我正在使用一個函數,如果一個按鍵被按下,另一個被按下,而不管第一個按鍵是否被按下,它將設置一個值爲真。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) 

的事情是,我希望能夠有它確保如果按下第二個關鍵是,第一個仍必須下來,從而使他人不能只按一個則其他很快,並使它看起來好像他們同時被壓下。

任何想法?

+0

我不認爲web瀏覽器支持多鍵按下。 – Ryan 2011-12-19 00:53:07

+0

@minitech - 我已經實現了一個簡單的遊戲,它使用keydown和keyup事件來維護一個表,其中的按鍵處於關閉狀態,並且它可以一次同時使用多個按鍵。 – nnnnnn 2011-12-19 01:03:01

回答

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 – 2011-12-19 14:59:56

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; //或false在keydown和keyup處理程序中和'if(keyStates [「39」]){}'在代碼的其他部分。比'.indexOf()'和'.splice()'更快更簡單。 – nnnnnn 2011-12-19 01:05:50

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 2011-12-19 01:08:26