2011-10-21 26 views
0

每当我尝试删除一个运行enterframe的对象/孩子时,我总是得到空引用错误。 在我的具体情况,该设置是战场中含有大量的机器人:安全地删除一个运行框架的孩子

  1. 孩子(机器人)dispatchEvent它被破坏
  2. 的父容器接收事件,并开始通过removeChild之和去除去除孩子来自一系列机器人的孩子。
  3. 在enterframe上,在循环移动机器人的过程中,有时我会得到空引用,所以我必须调用if(robots [i] == null)继续;

如果机器人在我的输入框中全部为空,您如何安全地将孩子移除而不洒水?

我的一个想法是在机器人框架内删除机器人列表,检查机器人是否被移除,如果有,请在那里进行移除,而不是机器人爆炸事件的回调。

+0

你可以发布代码吗?你如何穿过你的机器人集合?你是否保留一个数组,或者你是否在显示列表中循环显示了孩子? –

+0

你如何浏览你的机器人系列? 它只是机器人 数组你保持一个数组或者是你在显示列表遍历的孩子吗? 我保留阵列是因为在“战地”容器中有其他不是Robot的元素。 我会后的代码后,我也许应该提到这是HAXE不过,我遇到其他基于Flash的框架,这个问题如科罗娜SDK(使用Lua) – wahyudinata

+0

你让机器人管理器类叫做机器人来管理所有的机器人类实例。保持它的模块化和良好的OOP时尚封装。 –

回答

1

两件事情我通常做:

1)有一个active布尔对象中得到更新。当你打电话给你的destroy()功能或任何清理,设置activefalse。在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。

+0

我已经想到了用标志,以感觉相当肮脏,因为这意味着所有的移动对象都需要这样做,更新将不得不检查它。这是避免这种问题发生的常见做法吗?还是有更优雅的方式? – wahyudinata

+0

你的问题是一个对象可能在更新期间被删除。当你有很多对象在列表中更新时,这只是非常常见的。我不认为我曾经有过一个对象被更新的中间被删除,除非它被明确地调用。这几乎是如何在我见过的大多数引擎中完成的(这可能是另一种解决方案,这个只是最简单的方法) – divillysausages

+0

例如有一个'active'布尔值(在调用'update ()')也可以让你对你的游戏做其他事情,也就是让它更容易暂停整个组或特定的对象。这很常见 – divillysausages

0

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

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

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

喜欢的东西:

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

hmm从最终的声音中删除有趣的声音,我会在我回家后尝试。 因此发生的事情是,当循环的机器人,如果事件被分派将引入竞争条件,其中该指数在机器人被移除,它返回null时使用其指数 – wahyudinata

1

对于haXe中的一个,Array实际上有一个remove-方法。您可以使用它来移除机器人。该方法还报告了它的成功,让你的代码看起来是这样的:

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

不过请注意,调用卸下Array当它被遍历应该不会出现,或者你肯定会得到怪异的行为。