2013-06-13 49 views
0

好吧,所以我是AS3和Flash的初學者,我設法將這些代碼放在一起進行動畫製作。稱爲start_btn的按鈕應該啓動並停止名爲main_mc的動畫片段。在第一次點擊按鈕時,Movieclip應該播放(它會這樣做),但是在第二次點擊時,電影會停在動畫的中間(我不想)。 我的問題是,當您再次單擊按鈕時,如何才能使Movieclip完成播放其動畫,然後在最後一幀停止播放?AS3按鈕在完成播放後停止Movieclip

我曾考慮過使用if (main_mc.currentFrame == main_mc.totalFrames); {main_mc.stop();,但Movieclip仍然停留在最後一幀。 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); 
    }` 

回答

0

嘗試main_mc.gotoAndStop(main_mc.totalFrames)。

0

我打算提供一個快速和骯髒的解決方案,但決定試着解釋一下當前實現中的一些問題,並嘗試重構和解釋,並且更好。不幸的是,我現在無法訪問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。爲此,我們將偵聽器添加到每幀調用的動畫片段中,並檢查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(); 
    } 
} 
+0

非常感謝您的代碼和解釋。我只知道一些命令,所以我從來沒有考慮過使用變量。代碼運行的很好,但是我遇到了一個問題。當Movieclip停止時,它太早停止一幀。 Movieclip有26幀。我測試了電影,並將Movieclip停止的時刻與時間線進行了比較,並且它在幀25而不是幀26上停止。我還跟蹤了main_mc.currentFrame和main_mc.totalFrames,分別獲得了「25」和「26」。無論如何,你是否知道解決這個問題,以便它停在第26幀上? –

+0

Mike不用擔心。至於在最後一幀停止,main_mc.totalFrames等於26,是否正確?如果是這樣,那麼最後一幀的編號將是25而不是26.這是因爲幀編號從零開始而不是一個。因此,main_mc的幀號將爲「0,1,2,3,...,23,24,25」,共26幀。 – jayrobin

+0

這就是我第一次理解它,所以我不知道爲什麼我的動畫看起來像是在早期停止框架。我認爲追蹤它會有所幫助,但我想它沒有,大聲笑。無論如何,我只是稍微調整一下動畫,使它更平滑。非常感謝您的幫助和提示!實際上我有其他的按鈕是用多個add/removeEventListeners設置的,所以建議我使用變量來控制它們,而不是幫助一個大問題。再次,謝謝你! –