好的,所以我是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);
}`
答案 0 :(得分:0)
尝试main_mc.gotoAndStop(main_mc.totalFrames)。
答案 1 :(得分:0)
我打算提供一个快速而肮脏的解决方案,但决定尝试解释当前实现的一些问题,并尝试重构和解释更好的解决方案。不幸的是,我现在无权访问Flash,因此代码未经测试。
您经常添加和删除事件侦听器,这通常是一个坏主意。相反,由于您使用单个按钮来执行多个功能,因此在单独的变量中跟踪按钮状态是有意义的。在这种情况下,一个布尔值表示动画片段当前是否为playing
。
var playing:Boolean;
现在我们可以将mainaniS
和mainaniSt
合并为一个,并根据影片剪辑是否正在播放执行不同的操作,并将一个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
即表示我们希望稍后停止。
最后,我们需要确保动画片段在完成后停止,但仅当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();
}
}