两个键盘事件的活跃程度



我正在尝试执行两个javascript函数:

<body onkeydown="movimentation()">
<script> 
function movimentation(){
var key=event.key;
if(key==='8'){
up2();
console.log("the key pressioned is " + key);

};
if(key==="5"){
down2();
console.log("the key pressioned is " + key);
};
if(key==="6" ){
rigth2();
console.log("the key pressioned is " + key);
};
if(key==="4"){
left2();
console.log("the key pressioned is " + key);
};if(key==="w"){
up1();
console.log("the key pressioned is " + key);

};
if(key==="s" ){
down1();
console.log("the key pressioned is " + key);
};
if(key==="d"){
rigth1();
console.log("the key pressioned is " + key);
};
if(key==="a"){
left1();
console.log("the key pressioned is " + key);
}else{};
}
function p2movimentation(key){
if(key==='8'){
up2();
console.log("the key pressioned is " + key);

};
if(key==="5" && p2x<98){
down2();
console.log("the key pressioned is " + key);
};
if(key==="6" ){
rigth2();
console.log("the key pressioned is " + key);
};
if(key==="4"){
left2();
console.log("the key pressioned is " + key);
}else{};
};
function p1movimentation(key){
if(key==="w"){
up1();
console.log("the key pressioned is " + key);

};
if(key==="s"){
down1();
console.log("the key pressioned is " + key);
};
if(key==="d"){
rigth1();
console.log("the key pressioned is " + key);
};
if(key==="a" ){
left1();
console.log("the key pressioned is " + key);
}else{};
};

(上1((,下1((、右1((和左1((移动播放器1和上2((,向下2((、左2((移动玩家2(

但是第一个功能的激活阻止了第二个功能的启动。

我希望这两个功能同时执行。

您可以制作一个包装器函数,它将调用其他两个函数,如下所示:

function wrapperFunction(e){
p1movimentation(e);
p2movimentation(e);
}
function p1movimentation(e){
console.log("p1movimentation");
}
function p2movimentation(e){
console.log("p2movimentation");
}
<body onkeydown="wrapperFunction();"></body>

没有办法做到这一点。

Javascript是单线程的。它一次只能做一件事。即使将多个事件侦听器附加到某个对象,javascript仍然会一次运行一个事件侦听程序。如果另一个事件在javascript忙于做某件事时触发,那么在完成当前操作之前,它不会运行相关代码。javascript执行此操作的方式称为事件循环。

为了达到你想要的效果,你可能需要重新思考你的两个功能在做什么。也许你需要把功能分开,这样功能就可以轮流了?例如CCD_ 1。如果您使用这些函数的主体编辑您的问题,我们可能会提供更多帮助。

编辑

我想我已经弄清楚问题出在哪里了。你所依赖的事实是,当用户按下一个键时,keydown会被重复触发,但问题是,如果用户按下第二个键,那么第二个密钥就会开始重复触发。

相反,您需要做的是跟踪当前按下的关键点。然后,例如,你可以制作一个每隔一段时间运行的游戏循环,检查当前按下的键,并做出相应的反应。

为了知道当前正在按下哪些键,您需要同时收听keydown事件和keyup事件。(当keydown被激发时,将该键添加到列表中。当keyup被激发时从列表中删除该键(。

这个stackoverflow的回答解释了同样的事情,但更加详细。这个问题指的是你正在挣扎的同一件事。

最新更新