从舞台和组中完全删除未命名的实例

时间:2012-11-13 04:40:34

标签: actionscript-3 instance destroy removechild

所以我有一堆电影剪辑“水果”的实例。他们都没有透露姓名。

我将它们添加到一个名为“fruitGroup”的母片中。

代码应该做的是点击任何水果实例,播放动画并永久销毁

效果很好,直到你的老鼠超过之前被毁坏的水果的坐标。水果重新出现!

fruitGroup.addEventListener(MouseEvent.MOUSE_OVER,fruitOver);
fruitGroup.addEventListener(MouseEvent.CLICK,fruitclick);
fruitGroup.mouseEnabled = false;

function fruitOver(e:MouseEvent)
{
    e.target.play();

}
function fruitclick(e:MouseEvent)
{
    e.target.gotoAndPlay(82);
    if (e.target._currentframe==100)
    {
        e.target.removeChild(e.target);
    }

}
编辑:我没有真正澄清我的设置。除了fruitGroup和我的CLICK监听器之外,我的设置还有两件事。基本符号有100帧。 1-81是在鼠标悬停时播放的摆动动画,82-100是在点击时播放的淡出动画。也许破坏应该发生在第100帧的基本符号内部?

1 个答案:

答案 0 :(得分:1)

你应该做两件事。首先,你必须将一个Event.ENTER_FRAME监听器添加到你点击的一个水果中,以便在它的currentFrame变为100时处理该事件,其次,删除正在播放的水果你必须这样做:

e.target.parent.removeChild(e.target);
e.target.removeEventListener(Event.ENTER_FRAME,yourFunction);

请注意参考中的parent,您必须检查是否有父母,否则您将遇到问题。

编辑:好的,让我澄清一下答案。你保留了MouseEvent.CLICK监听器,但是这样做:

fruitGroup.addEventListener(MouseEvent.CLICK,fruitclick);
function fruitclick(e:MouseEvent)
{
    if (e.target is Fruit) {
        e.target.gotoAndPlay(82);
        if (!e.target.hasEventListener(Event.ENTER_FRAME)) 
            e.target.addEventListener(Event.ENTER_FRAME,endPlay);
    }
}

然后你添加一个这样的ENTER_FRAME监听器:

function endPlay(e:Event):void 
{
    if (e.target._currentframe==100)
    {
        e.target.parent.removeChild(e.target);
        e.target.removeEventListener(Event.ENTER_FRAME,endPlay);
    }
}

此代码仍然可以驻留在主时间轴上,也可以位于有fruitGroup访问权限的任何类中,以启动对点击的监听。

这是如何工作的:当您点击水果时,会调用函数fruitClick,并将事件的目标设置为单击的水果。我们现在有参考 - 很好,现在我们为它分配一个监听器并让它播放你想要的动画。听众激活每一帧,事件的目标是完全相同的果实,一旦它的currentFrame达到100,我们就会让它的父母将果实释放出去(它很可能是fruitGroup,但如果不,这不会给出错误),并删除现在过时的监听器。