我不确定该如何措辞,因为我实际上不知道到底是什么导致了此错误。我正在尝试组装一个简单的小行星仿制品。
玩家射击时,使用array.push(...)
创建一个新对象(子弹)。一旦此项目符号超出画布(超出范围),则使用array.splice(...);
将其删除。
问题在于子弹以不可预测的方式运动。我不知道该怎么写,所以这是完整代码(有效,包括html / css):https://pastebin.com/tKiSnDzX
按住空格键几秒钟(拍摄),您将清楚地看到问题。您也可以使用A / D转动,并使用W前进。
我认为这是正在发生的事情。只要屏幕上(阵列中)只有一个项目符号,代码就可以正常运行。这意味着不正确的元素将被删除,或者进入对象构造函数的值在整个过程中都会被弄乱。
附件A(项目符号构造函数及其方法):
function Bullet(x,y,rot,vel) {
this.x = x;
this.y = y;
this.rot = rot;
this.vel = (vel+5);
this.move = function() {
this.x += this.vel*Math.cos(this.rot-Math.PI/2);
this.y += this.vel*Math.sin(this.rot-Math.PI/2);
}
this.draw = function() {
engine.circle(this.x, this.y, 4, "black");
var c = engine.canvas.getContext('2d');
c.translate(this.x, this.y);
c.rotate(this.rot);
c.beginPath();
c.strokeStyle="#00FF00";
c.strokeRect(-5, -5, 10, 10);
c.closePath();
c.stroke();
}
}
附件B(创建/删除项目符号的功能):
shoot: function() {
if(engine.keyDown.sp == true) {
if(this.fire > 20) {
engine.bullets.unshift(new Bullet(this.x, this.y, this.rot, this.velocity));
this.fire = 0;
} else {
this.fire++
}
}
for(i = 0; i < engine.bullets.length; i++) {
engine.bullets[i].move();
engine.bullets[i].draw();
if(engine.bullets[i].x > engine.canvas.width+5 || engine.bullets[i].x < -5
|| engine.bullets[i].y > engine.canvas.height+5 || engine.bullets[i].y < -5) {
console.log('bullet gone, '+i);
engine.bullets.splice(i, 1);
}
}
}
数组声明如下:
bullets: []
谢谢您的回答。
最佳答案
怎样用engine.bullets[i].dead = true;
标记需要在循环中遇难的子弹,然后在循环末尾用engine.bullets = engine.bullets.filter(b => !b.dead);
过滤掉死掉的子弹
关于javascript - 添加和删除数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53158205/