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

});

但是我怎样才能让它同时旋转和向前移动呢?

4

2 回答 2

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

然后只需在 keyup 侦听器中侦听这些键并将 turn/move 设置为 false。

于 2012-07-18T20:59:32.913 回答
0

据我所知,你无法做你想做的事。唯一可以同时按下的键是ctrlshiftalt

$(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数组中(除非它已经被存储),然后程序将检查被按下的键,最后,当用户“鼠标向上”时,数组将被重置。

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

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
}
于 2012-07-18T20:56:34.653 回答