Flash 在enterframe运行时安全地移除儿童
每当我试图删除运行enterframe的对象/子对象时,总是会出现空引用错误。 在我的特殊情况下,战场的设置包含很多机器人:Flash 在enterframe运行时安全地移除儿童,flash,actionscript-3,actionscript,haxe,Flash,Actionscript 3,Actionscript,Haxe,每当我试图删除运行enterframe的对象/子对象时,总是会出现空引用错误。 在我的特殊情况下,战场的设置包含很多机器人: 一个孩子(机器人)发送事件,它被摧毁 父容器接收事件并开始通过removeChild移除子容器,并从机器人阵列中移除子容器 在enterframe上,在循环移动机器人的过程中,有时我会得到null引用,因此如果(robots[I]==null)继续,我必须调用 如果机器人在我的整个框架内都是空的,你如何安全地移除孩子而不洒水 我的一个想法是在enterframe中列出要删
我的一个想法是在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。我曾想过使用标志,它感觉相当脏,因为这意味着所有移动对象都需要这样,更新将必须检查它。这是避免此类问题发生的常见做法吗?或者有更优雅的方法吗?您的问题是对象可能在更新过程中被删除。只有当列表中有很多对象得到更新时,这才是真正常见的。我不认为我曾经有一个对象被删除的中间对象的更新,除非它被专门调用。我见过的大多数引擎都是这样做的(很可能会有另一种解决方案,这是最简单的),例如,有一个活动的布尔值(在调用更新()之前检查它)也可以让你在游戏中做其他事情,也就是说,可以更轻松地暂停整个组或特定对象。这很常见