重放 Flash 电影时删除事件侦听器

Removing event listeners when replaying Flash movie

只是为了给你一个前言,我开始搞乱事件处理程序来修复在同一时间线内从一组循环帧跳到另一组循环帧时出现的不稳定动画过渡。

好的,假设我有一个由 5 帧组成的马 运行 动画。现在假设我有这些帧的三个不同的影片剪辑循环以不同的速度(实际上是不同的 fps):步行、小跑和疾驰。

现在假设我创建了一个按钮,让观众可以通过每组循环前进,然后创建另一个按钮,让他们从头开始重播。我最初的问题出现在从第一个循环 (1-5) 跳到下一个循环 (6-10) 时,因为基本上在任何时候按下前进按钮时我都会停止循环并从头开始。因此动画中出现了问题。

为了解决这个问题,我在网上找到了一个示例,您可以在其中使用事件侦听器来检查按下按钮时您所在的帧,然后让它完成循环,然后继续前进,从而消除任何奇怪的退缩。

这是事件代码:

forward1.addEventListener(MouseEvent.CLICK, trot); 

function trot(event: MouseEvent): void { 

addEventListener(Event.ENTER_FRAME, enterFrame); 
function enterFrame(e:Event):void { 
    if (currentFrame == 5) { 
        gotoAndPlay(6); } 

    } 
}

同时下一个看起来像这样:

forward2.addEventListener(MouseEvent.CLICK, gallop); 

function gallop(event: MouseEvent): void { 

addEventListener(Event.ENTER_FRAME, enterFrame); 
function enterFrame(e:Event):void { 
    if (currentFrame == 10) { 
        gotoAndPlay(11); } 

    } 
}

顺便说一句,我不知道它是否重要,但我在每个组的最后一帧上创建我的循环并将其发送回(该组的)第一帧。

所以,我在每组循环的按钮上听取了这些听众,并且它播放得很好......第一次。这是我当前的问题出现的地方。当我看到电影的最后时,我得到了这个:

playagain.addEventListener(MouseEvent.CLICK, fl_ClickToGoToAndPlayFromFrame_1);

function fl_ClickToGoToAndPlayFromFrame_1(event:MouseEvent):void
{
    gotoAndPlay(1);
}

这基本上只是让播放头在点击时回到第一帧。但是,现在无需等待用户单击以将动画转发到第二个循环集,电影会自动播放整个过程。

我的假设是第一个游戏中的事件侦听器仍然存在并且 运行。所以,本质上 Flash 看到的是 "Hey when you get to frame X go on to frame Y" "When you get to frame Y go to frame Z" 等等。

如何在解雇后删除这些侦听器?我可以在重放之前一次将它们全部删除吗?

或者,有没有更好的方法来检查在两组循环之间跳转时播放头的位置,在转到我指定的位置之前完成任何循环?

你是对的。您只需要删除事件侦听器。不过,我会避免嵌套您的函数。试试这个:

forward1.addEventListener(MouseEvent.CLICK, trot); 

function trot(event: MouseEvent): void {
    addEventListener(Event.ENTER_FRAME, enterFrame); 
}

function enterFrame(e:Event):void { 
    if (currentFrame == 5) { 
        removeEventListener(Event.ENTER_FRAME, enterFrame); 
        gotoAndPlay(6);
    }
}