重用一个数组,但很奇怪

时间:2013-07-25 00:11:39

标签: javascript html5 canvas html5-canvas

我只是想用HTML5和JS创建一个非常简单的游戏,现在我有一艘可以发射子弹的船。如果你拿着备用杆,子弹正确移动并正常工作。但是如果你在一个镜头中间按空格键,它将创建一个新的子弹,但速度将加倍。这是代码

function Bullet(x,y)
{
this.xPos = x; 
this.yPos = y; 
this.speed = 5; 
this.alive = true;
this.lifeTimer = 0;
}

tempBullet = new Bullet( -100, -100);
bullets[0] = tempBullet;

if (32 in keysDown && player.fired == false) //space
{ 
    //Create new bullet
    var bulletDone = false;
    player.fired = true;
    player.firedTimer = 1;
    tempBullet = new Bullet( player.xPos + 14, player.yPos);
    for( i = 0; i < bullets.length; i++ )
    {
        if( bullets[i].alive == false )
        {
            bulletDone = true;
            bullets[i] = tempBullet;
        }
    }

    if( bulletDone == false )
    {
        bullets[bullets.length] = tempBullet;
    }
}

if( player.firedTimer >= 1 )
{
    player.firedTimer++;
}

if( player.firedTimer >= 60 )
{
    player.firedTimer = 0;
    player.fired = false;
}

这些是代码片段,其余的东西会妨碍你。我是否错误地使用了我的子弹阵列中的旧资产?

欢呼帮助并阅读

1 个答案:

答案 0 :(得分:1)

tempBullet = new Bullet( player.xPos + 14, player.yPos);

请使用本地变量,您似乎忘记了var tempBullet for ( i = 0; i < bullets.length; i++ ) if( bullets[i].alive == false ) { bulletDone = true; bullets[i] = tempBullet; } 。虽然我猜不是你问题的原因。

tempBullet

请注意,在此循环中,您将所有死子弹重新分配给相同的 bullets。这意味着当您遍历tempBullet集合以动画(移动)所有这些集合时,您将多次访问var bulletDone = false; for (var i = 0; i < bullets.length; i++ ) { if ( ! bullets[i].alive ) { bulletDone = true; bullets[i] = new Bullet( player.xPos + 14, player.yPos); } } if ( ! bulletDone ) { bullets.push( new Bullet( player.xPos + 14, player.yPos) ); } 。当你每次增加它的位置时,这将总结并导致非正常的速度。

要解决此问题,请在每次要替换死弹时创建新的项目符号对象:

{{1}}