2011-12-19 2 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) 

것은 내가 사람을 그냥 다음을 누르지 수 있도록이 두 번째 키를 누를되는 경우, 첫 번째는 여전히 아래 있어야한다는 것을 확인해야 할 수 있도록하려면,이다 다른 사람은 빨리 그리고 동시에 그들이 동시에 눌렀다 것처럼 보이게하십시오.

아이디어가 있으십니까?

+0

웹 브라우저가 다중 키 누르기를 지원한다고 생각하지 않습니다. – Ryan

+0

@minitech - 필자는 keydown 및 keyup 이벤트를 사용하여 키가 다운 된 테이블을 유지하고 한 번에 여러 키를 사용하여 잘 작동하는 간단한 게임을 구현했습니다. – 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; keydown과 keyup 핸들러에서는 // 또는 false를, 다른 부분에서는'if (keyStates [ "39"]) {}를 사용한다. '.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

관련 문제