Javascript 一个帆布多人游戏,我不能按超过4个按钮

Javascript 一个帆布多人游戏,我不能按超过4个按钮,javascript,html,canvas,Javascript,Html,Canvas,因此,我试图了解画布和画布游戏,我现在(或多或少)在关注画布上的游戏 在本教程的某个时候,我想到了制作两个播放器的想法,这两个播放器应该在同一个键盘上控制(而不是在线多人游戏) 因此,我遵循教程给出的逻辑,找到了WASD和箭头的关键代码 我理解95%的代码,这意味着我不只是复制所有东西而不理解它。(我很快就会回到这个话题) 我的代码的问题是,当我向系统中添加另一个玩家时,我可以自由移动他们,而我一次只能控制一个玩家,当我试图同时移动两个玩家时,他们无法自由移动,我一次只能按下总共4个按钮 试用这

因此,我试图了解画布和画布游戏,我现在(或多或少)在关注画布上的游戏

在本教程的某个时候,我想到了制作两个播放器的想法,这两个播放器应该在同一个键盘上控制(而不是在线多人游戏)

因此,我遵循教程给出的逻辑,找到了WASD和箭头的关键代码

我理解95%的代码,这意味着我不只是复制所有东西而不理解它。(我很快就会回到这个话题)

我的代码的问题是,当我向系统中添加另一个玩家时,我可以自由移动他们,而我一次只能控制一个玩家,当我试图同时移动两个玩家时,他们无法自由移动,我一次只能按下总共4个按钮

试用这个片段,并用WASD和箭头玩转立方体,看看我在说什么

正如我所说,有一部分我不完全理解,这可能是这个错误的地方?我还是在代码段上标出了它

所以我的问题是:为什么我不能同时自由移动两名球员?

整个代码如下,我标记了我不理解的部分:

要获得最佳体验,请使用全屏功能

{
函数startName(){
myGameArea.start();
myStick=新组件(100100200200,“红色”);
K2=新组件(100100600200,“绿色”);
}
var myGameArea={
画布:document.createElement(“画布”),
开始:函数(){
var bodyID=document.getElementById(“body”);
this.canvas.width=bodyID.offsetWidth;
this.canvas.height=(bodyID.offsetHeight);
this.context=this.canvas.getContext(“2d”);
document.body.insertBefore(this.canvas,document.body.childNodes[2]);
this.interval=setInterval(updateGameArea,(1000/60));
//我不明白的部分
window.addEventListener('keydown',函数(e){
myGameArea.keys=(myGameArea.keys | | |[]);
myGameArea.keys[e.keyCode]=true;
});
window.addEventListener('keyup',函数(e){
myGameArea.keys[e.keyCode]=false;
});
//结束
},
清除:函数(){
this.context.clearRect(0,0,this.canvas.width,this.canvas.height);
}
};
功能组件(宽度、高度、x、y、颜色、mLeft、mRight、mUpLeft、MUPRIGHT){
这个。宽度=宽度;
高度=高度;
这个.x=x;
这个。y=y;
这是0.speedX=0;
该值为0;
this.update=函数(){
ctx=myGameArea.context;
ctx.fillStyle=颜色;
ctx.fillRect(this.x,this.y,this.width,this.height);
};
this.newPos=函数(){
this.x+=this.speedX;
this.y+=this.speedY;
};
this.player1=函数(){
这是0.speedX=0;
该值为0;
如果(myGameArea.keys&&myGameArea.keys[65]){this.speedX=-2;}//左
如果(myGameArea.keys&&myGameArea.keys[68]){this.speedX=2;}//正确
如果(myGameArea.keys&&myGameArea.keys[87]){this.speedY=-2;}//向上
如果(myGameArea.keys&&myGameArea.keys[83]){this.speedY=2;}//向下
};
this.player2=函数(){
这是0.speedX=0;
该值为0;
如果(myGameArea.keys&&myGameArea.keys[37]){this.speedX=-2;}//左
如果(myGameArea.keys&&myGameArea.keys[39]){this.speedX=2;}//正确
如果(myGameArea.keys&&myGameArea.keys[38]){this.speedY=-2;}//向上
如果(myGameArea.keys&&myGameArea.keys[40]){this.speedY=2;}//向下
};
}
函数updateGameArea(){
myGameArea.clear();
myStick.player1();
myStick.newPos();
神秘的2.player2();
newPos();
myStick.update();
myStick2.update();
}
}
.nm{
保证金:0;
填充:0;
}
帆布{
显示:块;
背景颜色:浅灰色;
}

帆布棒游戏!

不确定错误是什么,虽然看起来还行,但有几个问题。虽然我不认为我是一个最新的学生,但我不能提供任何选择。

我做了一些改变来改善整个情况,但是你仍然会丢失钥匙,我不知道为什么,因为标准没有提到丢失钥匙(它说必须报告所有钥匙)

同时(在1/60秒内)按4个或更多键时,不会报告任何键。当两个人在玩时,这种情况极不可能发生,但当一个人测试两个方向的垫子时,这种情况经常发生。我不知道有什么解决办法

key event keyCode已贬值,您应该使用
event.key
,它是一个字符串,但event.key仅部分受支持

{
//关键地图
常数键向上=38;
常数键向下=40;
const KEY_LEFT=37;
const KEY_RIGHT=39;
常数键W=87;
常数键=83;
常数键A=65;
常数键D=68;
const DIR_KEY_MAP2=[KEY_W,KEY_S,KEY_A,KEY_D];
const DIR_KEY_MAP1=[KEY_UP,KEY_DOWN,KEY_LEFT,KEY_RIGHT];
const BLOCK_DEFAULT_FOR=[KEY_W,KEY_S,KEY_A,KEY_D,KEY_UP,KEY_DOWN,KEY_LEFT,KEY_RIGHT];
const keyEvents=function(event){//keyboard event listener在keydown为false时将键数组设置为true,否则设置为false
如果(!event.repeat){//忽略重复的键事件
myGameArea.keys[event.keyCode]=event.type==“keydown”;
}
//b