首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ActionScritp 3 removeChild in循环

ActionScritp 3 removeChild in循环
EN

Stack Overflow用户
提问于 2013-09-18 17:06:10
回答 1查看 133关注 0票数 0

我有两个阵列,火球和贡巴斯(敌人)。当我创建fireball和gomba时,使用push()将它们添加到数组中;

我射火球,用福尔环移动贡巴斯。

代码语言:javascript
复制
for (var f:int = 0; f < fireballs.length; f++)
{
    // move fireballs
}

例如,如果火球走得太远,我也会移除火球。

代码语言:javascript
复制
if (myFireball.x + 1000 < player.x)
{
    if (myFireball.parent)
    {
        myFireball.parent.removeChild(myFireball);
        fireballs.splice(myFireball, 1);
    }
}

我没有问题移除火球,但如果火球hitTestObject贡巴,我想删除两个,火球和贡巴,蚂蚁,这是我的问题。

我试过这样做,我得到了错误,一个术语是未定义的,没有属性。

代码语言:javascript
复制
for (i = 0; i < fireballs.length; i++)
{
    for (var m = 0; m < gombas.length; m++)
    {
        if (fireballs[i].hitTestObject(gombas[m]))
        {
        if (fireballs[i].parent)
            {
                fireballs[i].parent.removeChild(fireballs[i]);
                // same for gombas
            }
        }
    }
}

如果我使用相同的循环,但只需检查火球和贡巴斯是否可见,如果火球击中贡巴斯,我设置为可见为假,它工作正常。为什么它不能与removeChild一起工作。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-18 21:29:49

正如@itcouldevenbeaboat所说,当循环遍历数组并移除对象时,最好向后循环;这样,就不会出现索引问题。

例如,使用数组["one","two","three"],如果您按如下方式循环并删除:

代码语言:javascript
复制
for( var i:int = 0; i < myArray.length; i++ )
    myArray.splice( i, 1 );

发生了什么,这是:

  • i0开始,它指向"one"
  • 我们将位于0位置的对象从myArray中删除
  • myArray现在是["two","three"]
  • 在循环的末尾,i被递增,成为1
  • 我们开始下一个迭代操作,i1,它指向"three"

在本例中,我们跳过了"two"字符串,因为splice修改了我们正在迭代的数组。如果我们倒退:

代码语言:javascript
复制
for( var i:int = myArray.length - 1; i >= 0; i-- )
    myArray.splice( i, 1 );

然后我们得到这个:

  • i2开始,它指向"three"
  • 我们将位于2位置的对象从myArray中删除
  • myArray现在是["one","two"]
  • 在循环结束时,i将减少,并成为1
  • 我们开始下一个迭代操作,i1,它指向"two"

因此,我们从myArray中删除所有对象,没有问题。

对于特定的示例,当您从这两个数组中移除对象时,您应该向后迭代,这应该会给您提供如下内容:

代码语言:javascript
复制
outer: for ( var i:int = fireballs.length - 1; i >= 0; i-- )
{
    for ( var m:int = gombas.length - 1; m >= 0; m-- )
    {
        if (fireballs[i].hitTestObject(gombas[m]))
        {
            // remove our fireball and gombas graphics
            if( fireballs[i].parent != null )
                fireballs[i].parent.removeChild( fireballs[i] );
            if( gombas[m].parent != null )
                gombas[m].parent.removeChild( gombas[i] );

            // remove the fireball and gombas from the array; this is assuming
            // that once a fireball hits a gomba, they both disappear
            gombas.splice( m, 1 );
            fireballs.splice( i, 1 );

            // break to the outer loop; the fireballs one, as we don't need
            // to go any further in the inner one
            break outer;
        }
    }
}

注意fireballs循环上的fireballs标签;一旦检测到fireballgomba之间的冲突,就可以跳出。

如果您想让fireball命中多个gombas,那么就不要删除图形或拼接数组。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18878217

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档