2011-02-22 66 views
10

在flash中没有简单的“删除所有子女”功能吗?我不明白为什么这个代码不起作用。我通过添加子:flash as3删除所有子女

for (var i in project_array[cp].project_type_clips){ 
     container.header.type_loader.addChildAt(project_array[cp].project_type_clips[i],i); 
     loadCount++ 
    } 

,然后通过其删除:

for (var i in project_array[cp].project_type_clips){ 
     container.header.type_loader.removeChildAt(i); 
    } 

但我得到一个错误,所提供的索引超出范围,然而一个夹子仍留在舞台上。同样,如果我尝试添加他们没有水平,像这样:

for (var i in project_array[cp].project_type_clips){ 
     container.header.type_loader.addChild(project_array[cp].project_type_clips[i]); 
     loadCount++ 
    } 

,并删除:

for (var i in project_array[cp].project_type_clips){ 
     container.header.type_loader.removeChild(project_array[cp].project_type_clips[i]); 
    } 

我得到同样的错误。

回答

45

另一个RemoveAllChildren循环:

while (container.numChildren > 0) { 
    container.removeChildAt(0); 
} 
+0

啊 - 没有意识到水平会随着剪辑被删除而改变。 – mheavers 2011-02-22 20:07:07

+0

注意:numChildren是在'DisplayObjectContainer'上定义的,因此您需要拥有该类型或子类的类。你不能为'DisplayObject'做这个,但它可以用于'Sprite':http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/DisplayObjectContainer.html – 2011-03-20 20:58:59

7

当您删除一个对象时,其他子对象的childIndex被更改。因此,你不能删除使用的增加值我的孩子,但不得不开始在numChildren的-1,然后下降:

for (var i:int = obj.numChildren-1; i >= 0; i--) { 
    obj.removeChildAt (i); 
} 

应该工作。

+0

@Matt:你是对的,显然应该说'i> = 0`。谢谢你发现错字:) – weltraumpirat 2011-02-22 19:52:00

2

这里是一个很好的方法,以消除所有的孩子有淡入淡出效果。你需要在你的类路径中包含TweenLite(或TweenMax)。

它通过每个孩子,淡出,完成后将其从舞台上移除。一旦这个命令被调用,立即添加孩子是安全的 - 我们可以按照升序顺序安全地遍历列表,因为在淡入效果完成之前没有任何东西被移除。

fadeOutChildren(myPanel, 3); 

下面的代码:

public function fadeOutChildren(symbol:DisplayObjectContainer, duration:Number=.5):void { 

     trace("REMOVING " + symbol.numChildren + " ITEMS"); 

     if (symbol != null) 
     { 
      for (var i:int=0; i<symbol.numChildren; i++) 
      { 
       TweenLite.to(symbol.getChildAt(i), duration, 
        { 
         alpha: 0, 

         onComplete: function(parent:DisplayObjectContainer, child:DisplayObject):void { 

          parent.removeChild(child);       
         }, 

         onCompleteParams: [symbol, symbol.getChildAt(i)] 
        }    
       ); 

      } 
     } 
    } 

这一下子淡出。如果您希望它们逐个淡出,您可以轻松地将delay: i*.2添加到TweenLite.to的参数列表中。

5

sprite.removeChildren();删除所有儿童here