我不确定该如何措辞,因为我实际上不知道到底是什么导致了此错误。我正在尝试组装一个简单的小行星仿制品。

玩家射击时,使用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/

10-12 03:24