希望您一切都好。我是JavaScript新手,正在从事游戏。一艘船向外星飞船射击,但有一个障碍。除了不起作用时,销毁功能可以完美地起作用。如果我发射激光武库,这些船会奇迹般地在弹幕中幸存下来,直到被最后一个激光击中。当外星人的手碰到任何激光时,我需要触发破坏功能的帮助。下面是相关的代码(我认为),并且有一个指向jsfiddle的链接。 http://jsfiddle.net/235mX/
function drawLaser(){
laserList.forEach(function(Laser){
Laser.y = Laser.y - 1;
Ly = Laser.y;
Lx = Laser.x;
ctx.beginPath();
ctx.fillStyle = Laser.color;
ctx.arc(Laser.x, Laser.y, 10, 2 * Math.PI, false);
ctx.fill();
ctx.closePath();
ctx.beginPath();
ctx.fillStyle = 'white';
ctx.arc(Laser.x, Laser.y + 10, 10, 2 * Math.PI, false);
ctx.fill();
ctx.closePath();
});
}
if(Lx >= Ax - 30 && Lx < Ax + 30 && Ly < Ay + 30 && Ly > Ay + 10){
destroyX = Lx;
destroyY = Ly;
enemy1 = 0;
destroy();
}
if(Lx >= Ax + 100 - 30 && Lx < Ax + 100 + 30 && Ly < Ay + 30 && Ly > Ay + 10){
destroyX = Lx;
destroyY = Ly;
enemy2 = 0;
destroy();
}
if(Lx >= Ax + 200 - 30 && Lx < Ax + 200 + 30 && Ly < Ay + 30 && Ly > Ay + 10){
destroyX = Lx;
destroyY = Ly;
enemy3 = 0;
destroy();
}
if(Lx >= Ax + 300 - 30 && Lx < Ax + 300 + 30 && Ly < Ay + 30 && Ly > Ay + 10){
destroyX = Lx;
destroyY = Ly;
enemy4 = 0;
destroy();
}
最佳答案
那是因为您的碰撞检测不会检查每个与每个激光发生碰撞的敌人。它仅通过检查全局变量Lx
和Ly
对照最后一个激光器检查它们。要解决此问题,您需要将碰撞检测代码包装到另一个laserList.forEach(function(Laser){
中,以便将每个敌人的位置与每个激光器的位置进行比较。
当您不使用全局变量时,您可能会更早发现该错误。您可以在本地范围内定义变量,方法是在其前面加上关键字var
。我建议您使用use strict mode禁用隐式变量创建。
关于javascript - js Canvas 发射无用的激光,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20779465/