AS3按钮在完成播放后停止Movieclip

时间:2013-06-13 08:19:13

标签: actionscript-3 button movieclip

好的,所以我是AS3和Flash的初学者,我设法将这些代码放在一起制作动画。一个叫做start_btn的Button应该启动和停止一个名为main_mc的动画片段。在第一次单击Button时,Movieclip应该播放(它会播放),但是在第二次单击时,电影会在动画中间停止(我不想要)。 我的问题是,当您第二次单击按钮时,如何让Movieclip完成播放动画然后停在最后一帧?

我考虑使用if (main_mc.currentFrame == main_mc.totalFrames); {main_mc.stop();,但Movieclip仍未在最后一帧停止。 Movieclip本身在最后一帧上也有一个gotoAndPlay(2);命令,以便在第二次单击Button之前重复动画。

这是我的代码:

`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);
    }`

2 个答案:

答案 0 :(得分:0)

尝试main_mc.gotoAndStop(main_mc.totalFrames)。

答案 1 :(得分:0)

我打算提供一个快速而肮脏的解决方案,但决定尝试解释当前实现的一些问题,并尝试重构和解释更好的解决方案。不幸的是,我现在无权访问Flash,因此代码未经测试。

您经常添加和删除事件侦听器,这通常是一个坏主意。相反,由于您使用单个按钮来执行多个功能,因此在单独的变量中跟踪按钮状态是有意义的。在这种情况下,一个布尔值表示动画片段当前是否为playing

var playing:Boolean;

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

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();
    }
}