控制影片片段播放作業

Flash Player 9 以及更新的版本,Adobe AIR 1.0 以及更新的版本

Flash 是使用內含時間軸的方式來播放動畫或變更播放時的狀態。使用時間軸的任何視覺元素都必須是屬於 MovieClip 物件或是擴充自 MovieClip 類別的物件。雖然 ActionScript 可以控制任何影片片段停止、播放或前往時間軸上的其它點,但不能用來以動態方式建立時間軸或在特定影格增加內容。這項作業只能由 Flash 編寫工具來執行。

在播放 MovieClip 時,它會沿著時間軸並依據 SWF 檔的影格速率所指定的速度播放。或者,您也可以設定 ActionScript 的 Stage.frameRate 屬性,覆寫這項設定。

播放和停止影片片段

play() stop() 方法可以跨越其時間軸對影片片段執行基本的控制。例如,假設在「舞台」上有影片片段元件,其中包含腳踏車移過螢幕的動畫,而其實體名稱設定為 bicycle 。如果下列程式碼附加到主要時間軸上的關鍵影格,

bicycle.stop();

腳踏車將不會移動 (其動畫將不會播放)。透過其它某些使用者互動,便可以開始移動腳踏車。例如,如果您有名為 startButton 的按鈕,在主要時間軸上的關鍵影格之下列程式碼將可以達到按一下按鈕使動畫播放的目的:

// This function will be called when the button is clicked. It causes the  
// bicycle animation to play. 
function playAnimation(event:MouseEvent):void 
{ 
    bicycle.play(); 
} 
// Register the function as a listener with the button. 
startButton.addEventListener(MouseEvent.CLICK, playAnimation);

向前快轉與倒帶

play() stop() 方法並不是控制影片片段中播放的唯一方式。您也可以使用 nextFrame() prevFrame() 方法,手動將播放磁頭沿著時間軸向前或向後移動。呼叫上述任一種方法時,都會先停止播放,然後分別向前或向後將播放磁頭移動一個影格。

每當觸發影片片段物件的 enterFrame 事件時,使用 play() 方法便與呼叫 nextFrame() 類似。您可以為 enterFrame 事件建立事件偵聽程式,並通知 bicycle 在偵聽程式函數中前往它的前一個影格,讓 bicycle 影片片段向後播放,如下列程式碼所示:

// This function is called when the enterFrame event is triggered, meaning  
// it's called once per frame. 
function everyFrame(event:Event):void 
{ 
    if (bicycle.currentFrame == 1) 
    { 
        bicycle.gotoAndStop(bicycle.totalFrames); 
    } 
    else 
    { 
        bicycle.prevFrame(); 
    } 
} 
bicycle.addEventListener(Event.ENTER_FRAME, everyFrame);

在正常播放作業中,如果影片片段不只有單一影格,在播放時則將不斷地循環。也就是說,當播放到最後的影格後,它會回到「影格 1」繼續循環。當您使用 prevFrame() nextFrame() 時,此行為不會自動發生 (當播放磁頭在「影格 1」時呼叫 prevFrame() ,不會將播放磁頭移到最後一個影格)。在上述範例中的 if 條件會檢查播放磁頭是否已經向後回到第一個影格,然後將播放磁頭設定為前進到最後的影格,以便有效地建立一個繼續向後播放的影片片段迴圈。

跳至不同的影格與使用影格標籤

將影片片段傳送至新的影格是一項簡單的工作。只要呼叫 gotoAndPlay() gotoAndStop() 其中一種,就可以讓影片片段跳至指定為參數的影格編號。另一種方式是,您可以傳遞一個與影格標籤名稱相符的字串。您可以為時間軸上的任何影格指定標籤。如果要執行這項作業,請在時間軸上選取一個影格,然後在「屬性」檢測器的「影格標籤」欄位中輸入名稱。

使用影格標籤取代影格編號的優點,在建立複雜的影片片段時特別明顯。當動畫中的影格、圖層和補間的數量愈來愈多時,您可以考慮為重要的影格加上標籤,用來詳細描述影片片段行為的變化 (例如,「靜止」、「走動」或「跑動」)。這種方式可提高程式碼的可讀性,同時也提供了更大的彈性,因為 ActionScript 呼叫而前往已加上標籤之影格的是指向單一參考 (標籤) 的指標,而不是特定的影格編號。如果您稍後決定將動畫的特定部分移到不同的影格,那麼只要在新位置中為這些影格保留相同的標籤,就不需要變更 ActionScript 程式碼。

為了在程式碼中顯示影格標籤,ActionScript 3.0 還包括了 FrameLabel 類別。此類別的每個實體都代表單一影格標籤,而且具有代表影格標籤名稱 (在「屬性」檢測器中指定) 的 name 屬性,另外還有代表影格數目的 frame 屬性,該影格的標籤是放置在時間軸上。

為了存取與影片片段實體關聯的 FrameLabel 實體,MovieClip 類別包括會直接傳回 FrameLabel 物件的兩個屬性。 currentLabels 屬性會傳回陣列,其中含有橫跨整個影片片段時間軸的所有 FrameLabel 物件。 currentLabel 屬性則會傳回字串,其中包含最近在時間軸上所遇到的影格標籤名稱。

假設您已建立影片片段 robot 並且為它的一些動畫狀態加上標籤,您可以設定一個條件來檢查 currentLabel 屬性,以存取目前 robot 的狀態,如下列程式碼所示:

if (robot.currentLabel == "walking") 
{ 
    // do something  
}

Flash Player 11.3 和 AIR 3.3 為 FrameLabel 類別新增了 frameLabel 事件。您可以將事件處理常式指定給代表影格標籤的 FrameLabel 實體。當播放磁頭進入影格時,會傳送事件。

下列範例會在 MovieClip 的影格標籤陣列中,為第二個影格標籤建立 FrameLabel 實體。然後,為 frameLabel 事件註冊事件偵聽程式:

var myFrameLabel:FrameLabel = robot.currentLabels[1]; 
myFrameLabel.addEventListener(Event.FRAME_LABEL, onFrameLabel); 
 
function onFrameLabel(e:Event):void { 
    //do something 
}

使用場景

在 Flash 編寫環境中,您可以使用場景來區分 SWF 檔將要處理的各個時間軸。您可以使用 gotoAndPlay() gotoAndStop() 方法的第二個參數,指定播放磁頭要移動的目的地場景。所有 FLA 檔都是由一個起始場景開始,但是您可以建立新場景。

使用場景不一定是最佳的做法,因為場景會有一些缺點。Flash 文件中如果含有多個場景,維護作業會變得很困難,特別是在具有多位製作人員的環境中。使用多個場景也會讓頻寬變得不具效率,因為發佈程序會將所有場景合併成單一時間軸。這種情況會造成以漸進方式下載所有場景,即使從未播放過這些場景也是如此。基於這些原因,除非是為了組織多個以時間軸為基礎的長篇動畫,否則,通常不建議您使用多個場景。

MovieClip 類別的 scenes 屬性會傳回 Scene 物件的陣列,代表 SWF 檔中的所有場景。 currentScene 屬性會傳回 Scene 物件,代表目前播放的場景。

Scene 類別具有數個提供場景資訊的屬性。 labels 屬性會傳回 FrameLabel 物件的陣列,代表該場景中的影格標籤。 name 屬性會以字串形式傳回場景的名稱。 numFrames 屬性會傳回 int,代表場景中的影格總數。