如何同时处理更多密钥?

时间:2012-07-18 20:48:40

标签: javascript jquery keydown easeljs

我正在使用画架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();
}

});

但是我如何才能让它同时旋转并向前移动呢?

2 个答案:

答案 0 :(得分: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);

然后只是听一下键盘监听器上的那些键并将turn / move设置为false。

答案 1 :(得分:0)

据我所知,你无法做你想做的事。可以同时按下的唯一键是 ctrl shift 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数组中(除非它已经存储过),然后程序将检查按下的键,最后是用户“mouses up”,阵列将被重置。

注意: 我们假设按下的键分别是 A B 。如果要检查是否按此顺序按下了它们,则必须使用以下条件:

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
}