Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/457.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何同时处理更多的键?_Javascript_Jquery_Keydown_Easeljs - Fatal编程技术网

Javascript 如何同时处理更多的键?

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

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

});

但是我如何使它同时旋转和向前移动呢?

据我所知,你不能做你想做的事。可以同时按下的键只有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 = [];
});
这样,无论何时按下一个键,它都将存储在
键数组中(除非已经存储),然后程序将检查按下的键,最后,当用户“向上移动”时,数组将重置

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

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
}

据我所知,你不能做你想做的事。可以同时按下的键只有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 = [];
});
这样,无论何时按下一个键,它都将存储在
键数组中(除非已经存储),然后程序将检查按下的键,最后,当用户“向上移动”时,数组将重置

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

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