2011-12-19 108 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