Я не знал, как это сформулировать, потому что я не знаю, что именно вызывает эту ошибку. Я пытаюсь собрать простой подделку астероидов.
Когда игрок стреляет, новый объект (Bullet) создается с использованием 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: []
Спасибо за любые ответы.