2011-12-19 12 views
6

tak teraz używam funkcji, która ustawi wartość na true, jeśli naciśnięty zostanie jeden klawisz, inny zostanie naciśnięty niezależnie od tego, czy pierwszy jest jeszcze wciśnięty.Wiele klawiszy wciskanych wciśnięty

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) 

Chodzi o to, chcę mieć możliwość to upewnij się, że jeśli drugi klawisz jest wciśnięty, że pierwszy z nich musi być nadal w dół tak, że ktoś nie może wystarczy nacisnąć jeden wówczas inne szybko i sprawiają, że wydaje się, jakby oba były wciśnięte w tym samym czasie.

Wszelkie pomysły?

+0

Nie sądzę, że przeglądarki obsługują wiele naciśnięć klawiszy. – Ryan

+0

@minitech - Wdrożyłem prostą grę, w której użyto zdarzeń typu keydown i keyup, aby utrzymać tabelę, której klawisze są wyłączone i która działała dobrze z wieloma klawiszami naraz. – nnnnnn

Odpowiedz

6

Zakładając, że mamy jakąś „pętli gra” coś następujących robót (a może powinienem powiedzieć „powinno działać”, w które nie zostały zakodowane coś takiego od dłuższego czasu i tak Haven testowałem to z obecnymi przeglądarkami - zdecydowanie przyzwyczajeni do pracy):

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

Dziękuję wszystkim za odpowiedzi. Dziękuję przede wszystkim nnnnnn, pomógł mi dokładnie to, czego potrzebowałem, a proces jest bardzo zwięzły i działa sprawnie. Jesteście niesamowici: D: D; D –

2

Proponuję użyć Array do przechowywania kluczowych stanów.

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

Dzięki temu można zawsze sprawdzić tę tablicę dla kluczy, które są aktualnie naciskane.

+1

Proponuję obiekt, a nie tablicę. Zatem 'keyStates = {}', a następnie 'keyStates [e.keyCode] = true; // lub false' w kluczach keydown i keyup i 'if (keyStates [" 39 "]) {}' w innych częściach kodu. Szybszy i prostszy niż '.indexOf()' i '.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

elegancki. lubię to. +1 – jammypeach

Powiązane problemy