移动物体之间的空间

时间:2014-01-14 20:08:36

标签: arrays actionscript-3 flash actionscript

我在阵列中有一些敌人,他们左右移动。 更新敌人位置的简单代码:

// when the game starts, moveRight is true
var moveRight:Boolean = true;

for (var i:int = 0; i < enemies.length; i++)
{
if(moveRight)
{
// they are moving right
enemies[i].vx = 2;
}
else
{
// they are moving left
enemies[i].vx = -2;
}

// limit movement
if (enemies[i].x >= 550)
{
moveRight = false;
}
else if (enemies[i].x <= 50)
{
moveRight = true;
}

// move enemies
enemies[i].x += enemies[i].vx;

}

问题:每当敌人击中左边时(x <= 50),敌人之间的空间越来越大。我不擅长用英语解释事情,所以我在这里上传了非常基本的.swf示例:

http://www.fastswf.com/GXKix5s

只要看看左侧敌人发生的事情。

我可以通过添加一行代码来解决这个问题(下面是新代码) 在if-else语句中:

if (enemies[i].x >= 550)
{
moveRight = false;
}
else if (enemies[i].x <= 50)
{
moveRight = true;
// NEW CODE
enemies[i].x += 2;
}

即使有多行也可以使用,你可以在这里看到

http://www.fastswf.com/icsom6A

所以问题是导致问题的原因是什么? 每当他们从左到右改变方向时,为什么敌人之间的空间会变大? 如果我向后循环troguh数组,我在右侧有问题,而不是离开。

1 个答案:

答案 0 :(得分:0)

正在发生这种情况,因为当moveRight设置为true时,由于敌人[0] .x小于或等于50,敌人[0]已将其速度设置为-2。

所以在moveRight设置为true时发生的循环中,敌人[0]被移动-2像素,然后将moveRight设置为true,以便大于零的所有其他敌人移动+2。

修复它的一种方法是将检查移到循环外部(仅检查第一个和最后一个敌人):

for (var i:int = 0; i < enemies.length; i++)
{
    if(moveRight)
    {
        // they are moving right
        enemies[i].vx = 2;
    }
    else
    {
        // they are moving left
        enemies[i].vx = -2;
    }

    // move enemies
    enemies[i].x += enemies[i].vx;  
}

// limit movement
if (enemies[enemies.length-1].x >= 550)
{
    moveRight = false;
}
else if (enemies[0].x <= 50)
{
    moveRight = true;
}

另一个可能是两个循环:

for (var i:int = 0; i < enemies.length; i++)
{
    // limit movement
    if (enemies[i].x >= 550)
    {
        moveRight = false;
    }
    else if (enemies[i].x <= 50)
    {
        moveRight = true;
    }  
}

for (var i:int = 0; i < enemies.length; i++)
{
    if(moveRight)
    {
        // they are moving right
        enemies[i].vx = 2;
    }
    else
    {
        // they are moving left
        enemies[i].vx = -2;
    }

    // move enemies
    enemies[i].x += enemies[i].vx;  
}