为了给你一个序言,我开始搞乱事件处理程序,以便在同一时间线内从一组循环帧跳转到另一组循环帧时修复一个不稳定的动画过渡。
好吧,让我说我有一个由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会看到“当你到框架X时嘿嘿继续框架Y”“当你到框架Y去框架Z”等等。
如何解雇这些听众?我可以在重播之前一次性删除它们吗?
或者,有没有更好的方法来检查播放头在两组循环之间跳转的位置,在我告诉它之前完成它所处的循环?
答案 0 :(得分:1)
你是对的。您只需要删除事件侦听器。我会避免嵌套你的功能。试试这个:
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);
}
}