0

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

我考虑过使用if (main_mc.currentFrame == main_mc.totalFrames); {main_mc.stop();,但 Movieclip 仍然不会在最后一帧停止。影片剪辑本身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);
    }`
4

2 回答 2

0

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

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

var playing:Boolean;

现在我们可以将mainaniSand合二为一,并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()第一个块中调用:原因是您不想在单击按钮后立即停止动画剪辑,而是在单击按钮后播放动画剪辑。因此,我们只是设置playingfalse表示我们希望它稍后停止。

最后,我们需要确保动画剪辑在完成后停止,但前提playing是 is false。为此,我们向每帧调用的movieclip 添加一个侦听器,并检查是否playingfalse,以及它是否在最后一帧。注意最后一帧实际上是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();
    }
}
于 2013-06-13T12:21:19.183 回答
0

试试 main_mc.gotoAndStop(main_mc.totalFrames)。

于 2013-06-13T08:25:12.173 回答