2012-07-18 117 views
1

我正在用畫架js和jQuery製作遊戲。 我很想同時處理多個按鍵。 我有這段代碼的一個關鍵:如何同時處理更多按鍵?

$(document).keydown(function(e){ 
if (e.keyCode == 37) { 
    angle=angle+1; 

} 
if (e.keyCode == 40) { 
    rad=angle*Math.PI/180; 
    charachter.x=charachter.x-speed*Math.cos(rad); 
    charachter.y=charachter.y-speed*Math.sin(rad); 

    stage.update(); 
} 
if (e.keyCode == 39) { 
    angle=angle-1; 


} 
if (e.keyCode == 38) { 
    rad=angle*Math.PI/180; 
    charachter.x=charachter.x+speed*Math.cos(rad); 
    charachter.y=charachter.y+speed*Math.sin(rad); 

    stage.update(); 
} 

}); 

但我怎麼做,以便它旋轉,並在同一時間盼着搬家嗎?

+0

您可能需要保存在按鍵上按下哪些按鍵,然後繼續對定時器執行操作直至按下。 – MrOBrian 2012-07-18 20:55:01

+0

看看這裏:https://github.com/ccampbell/mousetrap – jedierikb 2012-07-18 20:55:26

+0

你也需要停止*所有*鍵,當使用鼠標右鍵或當窗口失去焦點。 – zzzzBov 2012-07-18 20:56:20

回答

1

你正在尋找一個監聽器裏將發生的事件的兩個。如果你想創建一個在鍵被按下後繼續運行的動作,你需要在一個循環中執行該動作,並用你的事件監聽器激活它。所以例如....

$(document).keydown(function(e){ 
    if (e.keyCode == 40) { 
     turn = true; 
    } 
    if (e.keyCode == 38) { 
     move = true; 
    } 
}); 

setTimeout(function() { 
    if(turn) { 
     // turn 
    } 
    if(move) { 
     // move 
    } 
}, 1000/24); 

然後只聽這些密鑰在密碼監聽器和設置轉/移動到false。

+0

突然你的角色轉向並永遠移動。你可能想要添加一個'keyup'聽衆... – zzzzBov 2012-07-18 21:01:00

+0

ty但是鍵39和37不是40而是反正 – Rasovica 2012-07-18 21:05:26

0

據我所知,你無法做到你想做的。可按下按鍵只有同時爲CTRL轉變ALT

$(document).keydown(function(e){ 
    var ctrl = e.ctrlKey, 
    shift = e.shiftKey, 
    alt = e.altKey, 
    altGr = e.altGraphKey, 
    code = e.keycode || e.which;  
    if(code==='65' && ctrl){ 
     //Ctrl+A 
    } 
    if(code==='65' && shift){ 
     //Shift+A 
    } 
    if(code==='65' && alt){ 
     //Alt+A 
    } 
    if(code==='65' && altGr){ 
     //AltGr+A 
    } 
}); 

不過,我不知道,如果這個例子中的所有主流瀏覽器(在Chrome,Firefox將工作,Safari,也許Opera和IE)。

另一種方式是做什麼@MrOBrian說,節約了按鍵陣列中的:

var keys = []; 
$(document).keydown(function(e){ 
    var key = e.keyCode || e.which; 
    if(keys.indexOf(key)===-1) 
     keys.push(key); 
    if(keys[0]===65 && keys[0]===66){ 
     //A and B pressed, respectively 
    } 
    if(keys.indexOf(67)!==-1 && keys.indexOf(68)!==-1){ 
     //C and D pressed, the order doesn't matter 
    } 
}); 
$(document).keyup(function(){ 
    keys = []; 
}); 

這樣一來,只要你按一個鍵,它會被存儲在keys陣列中(除非它有已存儲),然後程序將檢查被按下的鍵,最後,當用戶「鼠標懸停」時,該數組將被重置。

注意: 讓我們假設按下鍵分別爲一個。如果要檢查,如果他們在這個順序被壓,你必須使用這個條件:

if(keys[0]===65 && keys[0]===66){ 
    //A and B pressed, respectively 
} 

但是,如果你只是想檢查,如果對它們進行加壓和順序並不重要,你只要以檢查他們是否是keys陣中,與此條件:

if(keys.indexOf(65)!==-1 && keys.indexOf(66)!==-1){ 
    //A and B pressed, the order doesn't matter 
} 
+0

僅僅因爲一個鍵已經停止觸發它的'keydown'事件並不意味着它不再被按下。您只需存儲一個正在按下哪些鍵的引用,並在您收到該鍵的「鍵盤」事件時將其從引用中刪除。 – zzzzBov 2012-07-18 20:57:45

+0

你選擇了編輯嗎? – 2012-07-18 21:10:22

+1

好多了。我更喜歡使用一個對象作爲散列表而不是數組。只要記住在頁面失去焦點或用戶右鍵單擊時清除整組鍵。在這些事件發生之後,用戶可能會在沒有通知密鑰處理程序的情況下更改密鑰狀態。可能會有其他事件(contextmenu?)可以隱藏關鍵事件。 – zzzzBov 2012-07-18 22:46:11