完成播放后停止影片剪辑的 AS3 按钮
Posted
技术标签:
【中文标题】完成播放后停止影片剪辑的 AS3 按钮【英文标题】:AS3 Button to stop Movieclip after its finished playing 【发布时间】:2013-06-09 13:29:42 【问题描述】:好的,所以我是 AS3 和 Flash 的初学者,我设法将这段代码放在一起制作动画。一个名为 start_btn 的按钮应该用来启动和停止一个名为 main_mc 的影片剪辑。在第一次单击按钮时,Movieclip 应该播放(它会播放),但是在第二次单击时,电影在其动画中间停止(我不想要)。 我的问题是,当您再次单击按钮时,如何让 Movieclip 完成播放动画然后在最后一帧停止?
我考虑过使用if (main_mc.currentFrame == main_mc.totalFrames); main_mc.stop();
,但影片剪辑仍然没有在最后一帧停止。影片剪辑本身在最后一帧也有一个gotoAndPlay(2);
命令,以便在第二次单击按钮之前重复动画。
这是我的代码:
`start_btn.addEventListener(MouseEvent.CLICK, mainaniS);
function mainaniS(event:MouseEvent):void
main_mc.play();
start_btn.removeEventListener(MouseEvent.CLICK, mainaniS);
start_btn.addEventListener(MouseEvent.CLICK, mainaniSt);
function mainaniSt(event:MouseEvent):void
if (main_mc.currentFrame == main_mc.totalFrames);
main_mc.stop();
start_btn.removeEventListener(MouseEvent.CLICK, mainaniSt);
start_btn.addEventListener(MouseEvent.CLICK, mainaniS);
`
【问题讨论】:
【参考方案1】:试试 main_mc.gotoAndStop(main_mc.totalFrames)。
【讨论】:
【参考方案2】:我打算提供一个快速而肮脏的解决方案,但决定尝试解释您当前实现的一些问题,并尝试重构和解释并改进一个。不幸的是,我现在无法访问 Flash,因此代码未经测试。
您经常添加和删除事件侦听器,这通常是个坏主意。相反,由于您使用单个按钮来执行多个功能,因此在单独的变量中跟踪按钮状态是有意义的。在这种情况下,一个布尔值表示该影片剪辑当前是否为 playing
。
var playing:Boolean;
现在我们可以将mainaniS
和mainaniSt
合二为一,并根据影片剪辑是否正在播放执行不同的操作,只需将一个事件监听器保留在按钮上。我还冒昧地将方法命名为更有意义的名称:
start_btn.addEventListener(MouseEvent.CLICK, onStartClick);
function onStartClick(event:MouseEvent):void
if(playing)
playing = false;
else
playing = true;
main_mc.play();
您可能想知道为什么我们不在第一个块中调用main_mc.stop()
:原因是您不想在单击按钮时立即停止影片剪辑,而是在影片剪辑播放完毕后如果该按钮已被点击。因此,我们只需将playing
设置为false
以表明我们希望它稍后停止。
最后,我们需要确保动画剪辑在完成后停止,但前提是playing
是false
。为此,我们向每帧调用的movieclip 添加一个侦听器,并检查playing
是否为false
,以及它是否在最后一帧。请注意,最后一帧实际上是totalFrames - 1
:这是因为帧编号从零开始而不是从一开始(即如果totalFrames 为3,则帧编号将为0、1、2)。
main_mc.addEventListener(Event.ENTER_FRAME, animate);
function animate(event:Event):void
if(!playing && main_mc.currentFrame == main_mc.totalFrames - 1)
main_mc.stop();
所有重构代码一起:
var playing:Boolean;
start_btn.addEventListener(MouseEvent.CLICK, onStartClick);
main_mc.addEventListener(Event.ENTER_FRAME, animate);
function onStartClick(event:MouseEvent):void
if(playing)
playing = false;
else
playing = true;
main_mc.play();
function animate(event:Event):void
if(!playing && main_mc.currentFrame == main_mc.totalFrames - 1)
main_mc.stop();
【讨论】:
非常感谢您的代码和解释。我只知道一些命令,所以我从未考虑过使用变量。代码运行良好,但是我遇到了一个问题。当 Movieclip 停止时,它会过早停止一帧。影片剪辑有 26 帧。我测试了这部电影,并将 Movieclip 停止的时刻与时间线进行了比较,它确实停止在第 25 帧而不是第 26 帧。我还跟踪了 main_mc.currentFrame 和 main_mc.totalFrames 并分别得到了“25”和“26”。你知道如何解决这个问题,让它在第 26 帧停止吗? 不用担心迈克。至于在最后一帧停止,main_mc.totalFrames 等于 26,对吗?如果是这样,那么最后一帧的编号将是 25 而不是 26。这是因为帧编号从零开始,而不是从一开始。因此,您的 main_mc 的帧数将为“0, 1, 2, 3, ..., 23, 24, 25”,总共 26 帧。 这就是我第一次理解它的方式,所以我不知道为什么我的动画看起来像是提前停止了一帧。我认为追踪它会有所帮助,但我想它没有,大声笑。在任何情况下,我都会稍微调整一下动画,使其更加平滑。非常感谢您的帮助和提示!实际上,我还有其他使用多个 add/removeEventListeners 设计的按钮,因此建议我使用变量来控制它们反而有很大帮助。再次,非常感谢!以上是关于完成播放后停止影片剪辑的 AS3 按钮的主要内容,如果未能解决你的问题,请参考以下文章