完成播放后停止影片剪辑的 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;

现在我们可以将mainaniSmainaniSt 合二为一,并根据影片剪辑是否正在播放执行不同的操作,只需将一个事件监听器保留在按钮上。我还冒昧地将方法命名为更有意义的名称:

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 以表明我们希望它稍后停止。

最后,我们需要确保动画剪辑在完成后停止,但前提是playingfalse。为此,我们向每帧调用的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 按钮的主要内容,如果未能解决你的问题,请参考以下文章

在 AS3 中向子影片剪辑添加/删除事件侦听器

用flash as3语言如何将影片剪辑存入一个数组以及如何访问?

将鼠标悬停在完整播放影片剪辑

FLASH中影片剪辑嵌套按钮实现。AS2.0

如何以静默方式预加载有声音的影片剪辑?

AS3:如何从影片剪辑内部检查和重置主时间轴上的变量