Javascript 如何同时处理更多的键?
我正在用easeljs和jQuery做一个游戏。 我想同时处理多个按键。 我有一个键的代码:Javascript 如何同时处理更多的键?,javascript,jquery,keydown,easeljs,Javascript,Jquery,Keydown,Easeljs,我正在用easeljs和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=charachte
$(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();
}
});
但是我如何使它同时旋转和向前移动呢?据我所知,你不能做你想做的事。可以同时按下的键只有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 = [];
});
这样,无论何时按下一个键,它都将存储在键数组中(除非已经存储),然后程序将检查按下的键,最后,当用户“向上移动”时,数组将重置
注意:
假设按下的键分别是A和B。如果要检查它们是否按此顺序按下,必须使用以下条件:
if(keys[0]===65 && keys[0]===66){
//A and B pressed, respectively
}
if(keys.indexOf(65)!==-1 && keys.indexOf(66)!==-1){
//A and B pressed, the order doesn't matter
}
但是,如果您只想检查它们是否被按下并且顺序无关紧要,那么您只需检查它们是否在键
数组中,条件如下:
if(keys[0]===65 && keys[0]===66){
//A and B pressed, respectively
}
if(keys.indexOf(65)!==-1 && keys.indexOf(66)!==-1){
//A and B pressed, the order doesn't matter
}
据我所知,你不能做你想做的事。可以同时按下的键只有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 = [];
});
这样,无论何时按下一个键,它都将存储在键数组中(除非已经存储),然后程序将检查按下的键,最后,当用户“向上移动”时,数组将重置
注意:
假设按下的键分别是A和B。如果要检查它们是否按此顺序按下,必须使用以下条件:
if(keys[0]===65 && keys[0]===66){
//A and B pressed, respectively
}
if(keys.indexOf(65)!==-1 && keys.indexOf(66)!==-1){
//A and B pressed, the order doesn't matter
}
但是,如果您只想检查它们是否被按下并且顺序无关紧要,那么您只需检查它们是否在键
数组中,条件如下:
if(keys[0]===65 && keys[0]===66){
//A and B pressed, respectively
}
if(keys.indexOf(65)!==-1 && keys.indexOf(66)!==-1){
//A and B pressed, the order doesn't matter
}
您正在查找的两个事件都将发生在该侦听器中。如果您想创建一个在按键后继续运行的操作,您需要在循环中执行该操作,并使用事件侦听器激活它。例如
$(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。您要查找的两个事件都将发生在该侦听器中。如果您想创建一个在按键后继续运行的操作,您需要在循环中执行该操作,并使用事件侦听器激活它。例如
$(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侦听器中侦听这些键,并将“旋转/移动”设置为false。您可能需要保存在“向下键”上按下的键,并在计时器上继续其操作,直到“向上键”。查看此处:使用鼠标右键时,您还需要停止所有键,或者当窗口失去焦点时。因为我感觉很大方(主要是因为我有一段时间没有编写任何有趣的代码)。您可能需要保存按下“向下键”时按下的键,并在计时器上继续操作,直到按下“向上键”。看看这里:使用鼠标右键时,您还需要停止所有键,或者当窗口失去焦点时。因为我感觉很大方(主要是因为我有一段时间没有写任何有趣的代码)。仅仅因为某个键停止触发其keydown
事件并不意味着它不再被按下。您只需存储一个正在按下的键的引用,并在收到该键的keyup
事件时将其从引用中删除。这样做会更好。我更喜欢将对象用作哈希表,而不是数组。只要记住在页面失去焦点或用户右键单击时清除整组键。在这些事件之后,用户可能会在不通知密钥处理程序的情况下更改密钥状态。可能还有其他事件(contextmenu?)可以隐藏按键事件。仅仅因为按键停止触发其keydown
事件并不意味着它不再被按下。您只需存储一个正在按下的键的引用,并在收到该键的keyup
事件时将其从引用中删除。这样做会更好。我更喜欢将对象用作哈希表,而不是数组。只要记住在页面失去焦点或用户右键单击时清除整组键。在这些事件之后,用户可能会在不通知密钥处理程序的情况下更改密钥状态。可能还有其他事件(contextmenu?)可以隐藏关键事件。突然间,你的角色将永远旋转和移动。你可能想添加一个keyup
listener…ty但是39键和37键不是40键而是ty,不管怎样,你的角色突然开始转动并永远移动。您可能需要添加一个keyup
listener…ty,但键39和37不是turn 40,而是ty