Flash AS3 - 删除多个addChild

时间:2017-02-15 21:49:14

标签: actionscript-3 flash removechild clearinterval

我使用以下内容添加重复动画。

var recC01: cube01;
function attachC1() {
    recC01 = new cube01();
    recC01.x = -158;
    recC01.y = 159;
    addChild(recC01);
    trace("cube1");
}
var myIntervalC1: uint = setInterval(attachC1, 500);

以下是删除动画的代码:

btnBACK.addEventListener (MouseEvent.CLICK, back1);
function back1(event:MouseEvent) :void {
    gotoAndPlay(2);
var removeTimer;    
clearInterval(myIntervalC1);
recC01.parent.removeChild(recC01);
    trace ("back1") ;

}

在具有唯一名称的各种关键帧处添加重复动画。 即。 recC01,recC02等以及attachC1,attachC2等

在播放过程中,用户可以点击"返回"按钮可快退到上一部分。我正在努力,因为按钮出现在实例之前的时间轴上,所以我不能使用clearInterval和Removechild作为一个尚不存在的实例。我想在每次添加新孩子时避免创建唯一的var。跟踪这将是疯狂的。

用户可以在加载任何这些之前单击后退按钮,或者在之间说recC01和recC02 ......

删除所有子实例的最佳方法是什么? 有没有一种方法可以监听Interval和Child并将它们全部删除?

This a small screen capture of the animation. The boxes represent the liquid flow

更新 我以为我会在这里而不是在评论中更新。 我已将此添加到第2帧:

var cubeContainer:Sprite = new Sprite();
addChild(cubeContainer);

加载重复animation.class

的代码
var recC01: cube01;
function attachC1() {
    recC01 = new cube01();
    recC01.x = -158;
    recC01.y = 159;
    cubeContainer.addChild(recC01);
    trace("cube1");
}
var myIntervalC1: uint = setInterval(attachC1, 500);

后退代码:

btnBACKp1.addEventListener(MouseEvent.CLICK, back1);
function back1(event: MouseEvent): void {
cubeContainer.removeChildren();
gotoAndPlay(2);
trace("backFrame2");    
}

卸载一秒钟然后恢复加载。这可能是Interval的结果吗?以前卸载单个实例的代码,我不得不删除Interval

1 个答案:

答案 0 :(得分:0)

以下几种方法可以做得更清洁:

1。使用容器

代码中的某处(在显示代码之前)创建一个容器来容纳所有多维数据集:

var cubeContainer:Sprite = new Sprite();
addChild(cubeContainer);

然后,将所有多维数据集实例添加到该容器中:

cubeContainer.addChild(recC01);  //instead of just addChild(recC01)

现在,当你想让它们全部消失时,你可以这样做:

cubeContainer.removeChildren(); //this will remove all children of the container

此方法的唯一缺点是,如果您希望将多维数据集/形状与其他资源分层。使用此方法,所有形状将组合在一起作为一个图层的等效项。

2。删除该类的所有实例

由于看起来所有的多维数据集都是同一个类的实例,因此您可以循环显示列表并将其删除,如下所示:

function clearCubes(e:Event = null):void {   //added the e:Event = null in case you want to attach this function to an event listener
    //loop backwards through all the children (we loop backwards so the index doesn't get messed up when you remove an item)
    var i:int = numChildren;
    while(i--){  //while i is above 0
        if(getChildAt(i) is cube01){  //if this child is a cube01 instance
            removeChildAt(i); //remove it
        }
    }
}

如果你有一大堆类(在评论中提到),你可以给它们一个共同的基类。使用以下文本/代码创建名为AnimationObject.as的文件(与.fla文件位于同一目录中):

package {
    public class AnimationObject extends flash.display.MovieClip {

    }
}

然后,在Flash / AnimatePro中为每个形状添加基类。这可以通过转到库中的符号/影片剪辑属性,并将AnimationObject作为基类(而不是flash.display.MovieClip)来完成。然后在上面的代码示例中,将is cube01替换为is AnimationObject

3。在数组中跟踪它们

虽然我更喜欢容器,但如果需要以复杂/自定义的方式对对象进行分层,使用数组可以提供更大的灵活性。

//first create an array variable to hold a reference to all your shapes
var myShapes:Array = [];

//then, whenever you create a new shape/cube, add it to the array
function attachC1() {
   recC01 = new cube01();
   recC01.x = -158;
   recC01.y = 159;
   addChild(recC01);

   myShapes.push(recC01); // <-- THIS LINE added to your function

   trace("cube1");
}

然后,当你想要它们全部消失时,循环遍历数组并从数组和显示列表中删除它们:

function clearShapes(e:Event = null):void {   //added the e:Event = null in case you want to attach this function to an event listener
    while(myShapes.length){
        removeChild(myShapes.pop()); //pop will remove the last item in the array and return that item
    }
}