0

所以我有一堆电影剪辑“水果”的实例。他们都是无名的。

我将它们添加到一个名为“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 帧的基本符号内部?

4

1 回答 1

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,但如果不是,这不会给出错误) ,并删除现在已过时的侦听器。

于 2012-11-13T05:00:53.767 回答