检查数组中的变量

时间:2015-04-03 12:55:23

标签: javascript arrays collision

首次发布此处,并首次使用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;
            }
        }
}

但它不起作用。我想用“弹丸[i] .posy”代替“bullet.posy”,但它最终说射弹[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射击。

谢谢。

1 个答案:

答案 0 :(得分:2)

第一部分似乎似乎很清楚:调用一个名为newbullet的新子弹对象,其中.posx.posy的值由{设置} {1}}和ship.playerx。然后ship.playery存储在newbullet数组中。

其余的不太清楚。正如你所知,projectiles中for循环的if条件似乎是引用Collision()构造函数的.posy不是 {{1}刚刚创建的对象(new bullet())。您还希望迭代for循环.posy次,因为数组是零索引的:所以在for循环中使用newbullet运算符而不是projectiles.length - 1运算符。

假设<指定一个数字值,或者尝试为'projectiles'数组中的每个项目分配一个变量,因为它通过<=的for循环...

ship.playery

编辑:根据更新的问题

由于您拥有用于存储项目符号的Collision()数组,因此您可以轻松地将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; } } } 文字对象转换为构造函数,并根据您的喜好/需要/允许。然后,您的代码将遵循我的第一段中的描述,看起来像......

projectiles

...这也意味着您无需等待子弹到达bullet,然后才能创建另一个。 RAPID FIRE yay !!!