每当我尝试使用enterframe运行删除对象/子项时,我总是会得到null引用错误。 在我的特殊情况下,设置战场包含了很多机器人:
如果机器人在我的整个框架内都为空,你如何在不洒水的情况下安全地移除孩子?
我的一个想法是在enterframe中删除一个机器人列表,检查是否有要删除的机器人,如果存在,则执行删除操作,而不是机器人爆炸事件的回调。< / p>
答案 0 :(得分:1)
我通常做的两件事:
1)对象中的active
bool得到更新。当您致电destroy()
函数或要清理的任何内容时,请将active
设置为false
。在update()
功能中,请在开始时进行检查。如果active
为false
,请退出。
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]);