2012-06-13 70 views
4

我想在Flash中製作一個按鈕,用於暫停在我的文件中運行的所有影片剪輯。這些影片剪輯在我的主時間軸中都不是補間,它們都有各自的時間軸。每個移動片段都由一個指示剪輯開始播放的按鈕觸發。所以,如果任何人都可以幫我創建這個暫停按鈕,我將不勝感激。感謝您的時間。如何在Flash CS5中製作通用暫停按鈕?

+0

閱讀[* *此**](http://www.catb.org/~esr/faqs/smart-questions.html#before)第一個 – strah

回答

2

下應該做的伎倆:

// create an array to store all playing movieclips 
var playing = []; 

// when a movieclip is played add it to the array like this: 
// playing.push(myMovieClip); 

// call this from your pause button's click handler 
function pauseAll() 
{ 
    // loop through all the playing movieclips ... 
    for (var i = 0; i < playing.length; i ++) 
    { 
     // ... and stop them 
     playing[i].stop(); 
    } 

    // now clear the array 
    playing = []; 
} 
+0

太棒了,謝謝。有點乏味地回到我所有的電影剪輯中,並將其中的每一個單獨添加到播放陣列中,但它很有效。但是,清除數組必須超出for循環,否則它只會暫停數組的第一個對象。非常感謝,非常有幫助。 – dlee2499

+1

好地方!這就是爲什麼你應該總是測試孩子!更新了示例。 –

+0

實際上,當我一次運行多個影片剪輯(5個左右)時,我會得到一個輸出:「TypeError:Error#1010:一個術語未定義,並且沒有任何屬性。」並不是所有的剪輯都會暫停。它也說暫停功能。有任何想法嗎? – dlee2499

0

我不知道中斷所有影片剪輯的內置方式。

如果您保留對要在全局可訪問對象中暫停的影片剪輯的引用,則可以遍歷這些調用暫停的引用。

+1

我還是比較新的閃光,你能告訴我一個你是什麼樣的例子談論?感謝您及時的回覆。 – dlee2499

0

此功能將停止所有對象的嵌套的MovieClip。只需通過你的舞臺或頂級顯示類來停止/播放所有內容。這樣您就不必跟蹤將數據添加到數組中,而且沒有任何開銷。

function recursiveStop(parentClip:DisplayObjectContainer, useStop:Boolean = true, gotoFrame:Object = null):void { 
    var tmpClip:MovieClip = parentClip as MovieClip; 
    if (tmpClip) { 
     if (useStop) { 
      (gotoFrame != null) ? tmpClip.gotoAndStop(gotoFrame) : tmpClip.stop(); 
     }else { 
      (gotoFrame != null) ? tmpClip.gotoAndPlay(gotoFrame) : tmpClip.play(); 
     } 
    } 

    var i:int = parentClip.numChildren; 
    while(i--){ 
     if(parentClip.getChildAt(i) is DisplayObjectContainer){ 
      recursiveStop(parentClip.getChildAt(i) as DisplayObjectContainer, useStop, gotoFrame); 
     } 
    } 
} 
+0

請注意,如果您有不在顯示列表中的動畫片段,它們將不受此方法的影響。 – BadFeelingAboutThis

3

出口要暫停所有的符號/有一個基類像這樣的遞歸恢復,那麼你就不必走路整個顯示器樹:

package com.stackoverflow 
{ 
import flash.display.MovieClip; 
import flash.events.Event; 

[Event(name="clipAdded", type="flash.events.Event")] 
[Event(name="clipRemoved", type="flash.events.Event")] 
public class BaseClip extends MovieClip 
{ 
    protected var baseClipChildren:Array; 
    protected var paused:Boolean = true; 

    public function BaseClip() 
    { 
     super(); 
     baseClipChildren = new Array(); 
     addEventListener(Event.ADDED_TO_STAGE, onAdded); 
     addEventListener("clipAdded", onClipAdded); 
     addEventListener(Event.REMOVED_FROM_STAGE, onRemoved); 
     addEventListener("clipRemoved", onClipRemoved); 
    } 

    protected function onAdded(event:Event):void 
    { 
     var target:BaseClip = event.target as BaseClip; 
     if(target == this) { 
      dispatchEvent(new Event("clipAdded", true)); 
     } 
    } 

    protected function onClipAdded(event:Event):void 
    { 
     var target:BaseClip = event.target as BaseClip; 
     if(target && target != this) { 
      event.stopImmediatePropagation(); 
      baseClipChildren.push(target); 
     } 
    } 

    protected function onRemoved(event:Event):void 
    { 
     var target:BaseClip = event.target as BaseClip; 
     if(target == this) { 
      dispatchEvent(new Event("clipRemoved", true)); 
     } 
    } 

    protected function onClipRemoved(event:Event):void 
    { 
     var target:BaseClip = event.target as BaseClip; 
     if(target && target != this) { 
      event.stopImmediatePropagation(); 
      baseClipChildren.splice(baseClipChildren.indexOf(target),1); 
     } 
    } 

    public function stopAll():void { 
     stop(); 
     for each(var clip:BaseClip in baseClipChildren) { 
      clip.stopAll(); 
     } 
    } 

    public function playAll():void { 
     play(); 
     for each(var clip:BaseClip in baseClipChildren) { 
      clip.playAll(); 
     } 
    } 
} 
}