如何同时处理多个密钥

How to handle more keys at the same time?

本文关键字:密钥 处理 何同时      更新时间:2023-11-09

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

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

您要查找的两个事件都将发生在侦听器内部。如果你想创建一个在按键后继续运行的操作,你需要在循环中执行该操作,并用事件监听器激活它。例如。。。。

$(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。

据我所知,你不能做你想做的事。唯一可以同时按下的键是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
}