Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flash 在enterframe运行时安全地移除儿童_Flash_Actionscript 3_Actionscript_Haxe - Fatal编程技术网

Flash 在enterframe运行时安全地移除儿童

Flash 在enterframe运行时安全地移除儿童,flash,actionscript-3,actionscript,haxe,Flash,Actionscript 3,Actionscript,Haxe,每当我试图删除运行enterframe的对象/子对象时,总是会出现空引用错误。 在我的特殊情况下,战场的设置包含很多机器人: 一个孩子(机器人)发送事件,它被摧毁 父容器接收事件并开始通过removeChild移除子容器,并从机器人阵列中移除子容器 在enterframe上,在循环移动机器人的过程中,有时我会得到null引用,因此如果(robots[I]==null)继续,我必须调用 如果机器人在我的整个框架内都是空的,你如何安全地移除孩子而不洒水 我的一个想法是在enterframe中列出要删

每当我试图删除运行enterframe的对象/子对象时,总是会出现空引用错误。 在我的特殊情况下,战场的设置包含很多机器人:

  • 一个孩子(机器人)发送事件,它被摧毁
  • 父容器接收事件并开始通过removeChild移除子容器,并从机器人阵列中移除子容器
  • 在enterframe上,在循环移动机器人的过程中,有时我会得到null引用,因此如果(robots[I]==null)继续,我必须调用 如果机器人在我的整个框架内都是空的,你如何安全地移除孩子而不洒水


    我的一个想法是在enterframe中列出要删除的机器人列表,检查是否有要删除的机器人,如果有,则在那里进行删除,而不是在机器人爆炸事件上进行回调。

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

    我可以考虑两件事: 你说你从机器人列表中删除了这个孩子。因此,在列表中遇到空值似乎很奇怪;除非删除实现有错误

    在进入机器人的过程中,机器人实例是否可能被移除?如果是这样,从最后一个索引开始遍历列表可能会有所帮助。如果一个实例被删除,它将不会更改较低索引的项

    比如:

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

    我通常做两件事:

    1) 更新对象中的
    活动
    布尔值。当您调用
    destroy()
    函数或任何要清除的函数时,请将
    active
    设置为
    false
    。在
    update()
    函数中,首先进行检查。如果
    活动
    ,退出

    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 );
            }
        }
    }
    
    private函数_update():void
    {
    //更新我们的对象
    var-remove:Boolean=false;
    var len:int=this.m_objects.length;
    对于(变量i:int=0;i=0;i--)
    {
    if(this.m_objects[i].removeFromUpdate)
    {
    //可以选择调用对象的destroy()函数
    //这里
    //拼接阵列
    这个.m_对象.拼接(i,1);
    }
    }
    }
    

    这对我来说很有效。如果要在参数上保存对象,则可以选择让对象的
    update()
    函数返回true。对于haXe中的对象,
    Array
    实际上有一个
    remove
    -方法。你可以用它来移除机器人。该方法还报告了它的成功,因此您的代码如下所示:

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

    但是,请注意,
    数组
    上的remove调用不应在迭代过程中发生,否则您肯定会出现奇怪的行为。

    您可以发布代码吗?你如何浏览你的机器人收藏?你是保留一个数组还是在显示列表中循环子对象?你如何遍历你的robots集合?这只是一个机器人阵列,你是保留一个阵列,还是在显示列表中遍历子对象?我之所以保留阵列,是因为战场容器中有其他非机器人元素。稍后我将发布代码,我可能应该提到这是在Haxe中,但是,我在其他基于flash的框架中遇到了这个问题,例如coronasdk(使用lua),您可以创建名为Robots的robot管理器类来管理所有robot类实例。使其模块化并以良好的OOP方式封装。@它无法解决每当有事件被调度时的问题,如果管理器处理所有robot实例,它仍然会遇到null referenceNot。在这一点上,它变得微不足道。enterFrame循环永远不需要知道机器人是否为空。它只需要调用管理器类中的函数。嗯,从末尾删除听起来很有趣,我回家后会尝试。因此,在循环机器人的过程中,如果事件被调度,它将引入竞争条件,在该索引处的机器人被删除,因此当访问其索引时它将返回null。我曾想过使用标志,它感觉相当脏,因为这意味着所有移动对象都需要这样,更新将必须检查它。这是避免此类问题发生的常见做法吗?或者有更优雅的方法吗?您的问题是对象可能在更新过程中被删除。只有当列表中有很多对象得到更新时,这才是真正常见的。我不认为我曾经有一个对象被删除的中间对象的更新,除非它被专门调用。我见过的大多数引擎都是这样做的(很可能会有另一种解决方案,这是最简单的),例如,有一个
    活动的
    布尔值(在调用
    更新()之前检查它)也可以让你在游戏中做其他事情,也就是说,可以更轻松地暂停整个组或特定对象。这很常见