安全地删除运行enterframe的孩子

时间:2011-10-21 20:06:21

标签: flash actionscript-3 actionscript haxe

每当我尝试使用enterframe运行删除对象/子项时,我总是会得到null引用错误。 在我的特殊情况下,设置战场包含了很多机器人:

  1. 子(Robot)dispatchEvent它被销毁
  2. 父容器接收事件并开始通过removeChild删除子项,并从机器人数组中删除子项。
  3. 在enterframe上,在循环中移动机器人,有时我会得到null引用,所以我必须调用if(robots [i] == null)继续;
  4. 如果机器人在我的整个框架内都为空,你如何在不洒水的情况下安全地移除孩子?

    我的一个想法是在enterframe中删除一个机器人列表,检查是否有要删除的机器人,如果存在,则执行删除操作,而不是机器人爆炸事件的回调。< / p>

3 个答案:

答案 0 :(得分:1)

我通常做的两件事:

1)对象中的active bool得到更新。当您致电destroy()函数或要清理的任何内容时,请将active设置为false。在update()功能中,请在开始时进行检查。如果activefalse,请退出。

2)如果要删除对象,请将removeFromUpdate属性设置为true。在您的UpdateManager中(或者以对象上的update()为准)执行以下操作:

private function _update():void
{
    // update our objects
    var remove:Boolean = false;
    var len:int = this.m_objects.length;
    for( var i:int = 0; i < len; i++ )
    {
        this.m_objects[i].update();
        if( this.m_objects[i].removeFromUpdate )
            remove = true;
    }

    // if we don't have anything to remove, quit
    if( !remove )
        return;

    // we have something to remove, so traverse the array
    // backwards (so we don't have index problems)
    for( i = len - 1; i >= 0; i-- )
    {
        if( this.m_objects[i].removeFromUpdate )
        {
            // you can optionally call the object's destroy() function
            // here

            // splice the array
            this.m_objects.splice( i, 1 );
        }
    }
}

这对我很有用。如果要保存参数,则可以选择将对象的update()函数返回true;

答案 1 :(得分:1)

嗯,对于一个人来说,Array实际上有一个remove - 方法。您可以使用它来移除机器人。该方法还报告了它的成功,因此您的代码看起来像:

if (robotsArray.remove(explodedRobot)) 
    robotsLayer.removeChild(explodedRobot)

但是请注意,Array上的删除调用不应该在迭代时发生,否则你肯定会得到奇怪的行为。

答案 2 :(得分:0)

我还不能发表评论,所以必须这样做。

我能想到的两件事: 你说你从机器人列表中删除了孩子。所以你在列表中遇到空值似乎很奇怪;除非删除实现有错误?

在通过机器人进入ENTER_FRAME时,机器人实例是否可能被移除?如果是这样,如果你从最后一个索引开始通过列表可能会有所帮助。如果删除实例,则不会更改较低索引处的项目。

类似的东西:

for(var index: int = list.length; index--; ) doSomething(list[index]);