第一次在这里发布,并且第一次使用Javascript创建游戏。

我正在尝试在游戏中的两个对象(子弹和敌人)之间创建碰撞,但是目前,仅当子弹到达屏幕顶部时,才尝试使某些事情发生。

当我按E时,会发生这种情况:

if (69 in keysDown && timer == 0) //E
     {
    var newbullet = Object.create(bullet);
    newbullet.posx = ship.playerx;
    newbullet.posy = ship.playery;
    projectiles.push(newbullet);
    ship.shoot = true;
     }


然后,子弹将按照其更新功能中的说明向上移动。

我在我的游戏循环中不断运行此功能,该循环检查是否存在碰撞,如下所示:

function Collision()
{
        for (i = 0; i <= projectiles.length; i++)
        {
            if (bullet.posy < 0 )
            {
                ctx.fillText("HIT" , 160, 340);
                ship.health -= 1;
            }
        }
}


但这不起作用。我曾想用“ bullets.posy”替换为“ projectiles [i] .posy”,但最终说到“ projectiles [i]”是不确定的。

弹丸是一个整体阵列。

var projectiles=[];


这是项目符号:

var bullet =
    {
        posx:0,
        posy:0,
        speed: 10,
        power: 2,

        draw: function()
        {
            ctx.fillStyle = "rgb(200,100,0)";
            ctx.beginPath();
            ctx.rect(((this.posx - 5)), (this.posy - 30), 10, 25);
            ctx.closePath();
            ctx.fill();
        },

        setup: function(ax, ay)
        {
            this.posx = ax;
            this.posy = ay;
        },
        update: function()
        {
            this.posy -= this.speed;
        }
    };


有任何帮助或建议吗?

这是link,如果您想尝试的话
E射击。

谢谢。

最佳答案

第一部分似乎很清楚:调用了一个名为newbullet的新项目符号对象,并由.posx.posy设置了键ship.playerxship.playery的值。然后,将newbullet存储在projectiles数组中。

其余的不清楚。如您所知,Collision()中for循环的if条件似乎是在引用.posy构造函数的new bullet(),而不是刚创建的对象(.posy)的newbullet。您还需要迭代for-loop projectiles.length - 1时间,因为数组的索引为零:因此请在for-loop中使用<运算符,而不要使用<=运算符。

假设ship.playery分配了一个数字值,也许尝试为变量通过“ cc”的for循环时为“射弹”数组中的每个项目分配一个变量...

function Collision() {
    var projLength = projectiles.length; // slight optimisation to for-loop
    for (i = 0; i < projLength; i++) {
        var thisBullet = projectiles[i]; // reassign variable each iteration
        if (thisBullet.posy < 0 ) {
            ctx.fillText("HIT" , 160, 340);
            ship.health -= 1;
        }
    }
}


编辑:根据更新的问题

由于具有存储子弹的Collision()数组,因此可以轻松地将projectiles文字对象转换为构造函数,并根据需要/需要/允许数量进行创建。然后,您的代码将按照我在第一段中的描述进行操作,如下所示:

var projectiles = [];

var Bullet = function(x, y) {
    this.posx: x,
    this posy: y,
    speed: 10,
    power: 2,
    draw: function() {
        ctx.fillStyle = "rgb(200,100,0)";
        ctx.beginPath();
        ctx.rect(((this.posx - 5)), (this.posy - 30), 10, 25);
        ctx.closePath();
        ctx.fill();
    },
    setup: function(ax, ay) {
        this.posx = ax;
        this.posy = ay;
    },
    update: function() {
        this.posy -= this.speed;
    }
};

/* --- */

if (69 in keysDown && timer == 0) { // E
    var bullet = new Bullet(ship.playerx, ship.playery);
    projectiles.push(bullet);
    ship.shoot = true;
}

/* --- */

function Collision() {
    // as above ....
}


...这也意味着您无需等待子弹到达bullet即可创建另一个。快速起火耶!!!

09-17 05:49