Actionscript 3 从阶段和组中完全删除未命名实例

Actionscript 3 从阶段和组中完全删除未命名实例,actionscript-3,instance,destroy,removechild,Actionscript 3,Instance,Destroy,Removechild,所以我有很多电影剪辑“水果”的例子。他们都没有名字 我在一个名为“水果群”的母亲电影剪辑中加入了它们 代码应该做的是当任何水果实例被单击时,播放其动画,并永远销毁它 它工作得很好,直到你的鼠标越过先前被破坏的水果的坐标。这个水果突然出现了 fruitGroup.addEventListener(MouseEvent.MOUSE_OVER,fruitOver); fruitGroup.addEventListener(MouseEvent.CLICK,fruitclick); 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);
    }

}

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

您应该做两件事。首先,您必须添加一个Event.ENTER_FRAME listener到您单击的其中一个结果,以便使其在当前帧变为100时处理事件;其次,要删除正在播放的结果,您必须执行以下操作:

e.target.parent.removeChild(e.target);
e.target.removeEventListener(Event.ENTER_FRAME,yourFunction);
注意参考中的
父项
,您必须检查是否存在父项,否则您将遇到问题

编辑:好的,让我澄清一下答案。您可以保留MouseEvent.CLICK listener,但如下所示:

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);
    }
}
function endPlay(e:Event):void 
{
    if (e.target._currentframe==100)
    {
        e.target.parent.removeChild(e.target);
        e.target.removeEventListener(Event.ENTER_FRAME,endPlay);
    }
}
然后添加一个ENTER\u帧侦听器,如下所示:

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);
    }
}
function endPlay(e:Event):void 
{
    if (e.target._currentframe==100)
    {
        e.target.parent.removeChild(e.target);
        e.target.removeEventListener(Event.ENTER_FRAME,endPlay);
    }
}
此代码仍然可以驻留在主时间轴上,也可以位于任何可以访问
水果组
以开始侦听单击的类中


这是如何工作的:当你点击一个水果时,会调用函数
fruitClick
,事件的目标设置为点击的水果。我们现在有了引用-很好,现在我们给它分配一个侦听器,让它播放你想要的动画。侦听器激活每个帧,事件的目标是相同的结果,一旦它的
currentFrame
达到100,我们就调用它的父帧来释放它自己的结果(它很可能是
结果组
,但如果不是,则不会给出错误),然后删除现在已经过时的侦听器。

所以我应该进入水果的movieclip,添加一个EnterFrame,它做什么?我真的不明白,对不起!我尝试了代码,但现在单击没有任何作用。我认为问题在于第一个if(即目标是水果)。它应该检查基本符号的名称吗?我试着把水果换成水果,但还是不走运!在网上尝试了每一个奇怪的解决方案,甚至尝试制作我自己的课程……一切都很好,但再一次,水果不应该再出现了。它快把我逼疯了!嗯。我没有告诉你放下你的
MouseEvent.MOUSE\u在
监听器上。我的错。或者,如果你非常需要那个监听器,你应该修改它以更好地满足你的需要。我还忘了提到我想在鼠标上播放动画。这些水果应该在翻转时摆动,在点击时消失。如果我把鼠标放在上面,我将如何实现它/我将如何返工它?