Flash CS3 文件 |
|||
| ActionScript 3.0 程式設計 > 處理影片片段 > 控制影片片段播放作業 | |||
Flash 是使用暗含時間軸的方式來播放動畫或變更播放時的狀態。使用時間軸的視覺元素必須是屬於 MovieClip 物件或是擴充自 MovieClip 類別的物件。雖然 ActionScript 可以控制任何影片片段停止、播放或前往時間軸上的其它點,但不能用來以動態方式建立時間軸或在特定影格增加內容。這項作業只能由 Flash 編寫工具來執行。
在播放 MovieClip 時,它會沿著時間軸並依據 SWF 檔的影格速率所指定的速度播放。或者,您也可以設定 ActionScript 的 Stage.frameRate 屬性,覆寫這項設定。
play() 和 stop() 方法可以跨越其時間軸對影片片段執行基本的控制。例如,假設在「舞台」上有影片片段元件,其中包含腳踏車移過螢幕的動畫,而其實體名稱設定為 bicycle。如果下列程式碼是附加到主要時間軸上的關鍵影格,
bicycle.stop();
腳踏車將不會移動 (其動畫將不會播放)。透過其它某些使用者互動,便可以開始移動腳踏車。例如,如果您有名為 startButton 的按鈕,下列在主要時間軸上的關鍵影格之程式碼將可以達到按一下按鈕使動畫播放的目的:
// 按一下按鈕時將會呼叫此函數。它會使
// 腳踏車動畫進行播放。
function playAnimation(event:MouseEvent):void
{
bicycle.play();
}
// 使用按鈕將函數註冊為偵聽程式。
startButton.addEventListener(MouseEvent.CLICK, playAnimation);
play() 和 stop() 方法並不是控制影片片段中播放的唯一方式。您也可以使用 nextFrame() 和 prevFrame() 方法,手動將播放磁頭沿著時間軸向前或向後移動。呼叫上述任一種方法時,都會先停止播放,然後分別向前或向後將播放磁頭移動一個影格。
每當觸發影片片段物件的 enterFrame 事件時,使用 play() 方法類似於呼叫 nextFrame()。您可以為 enterFrame 事件建立事件偵聽程式,並通知 bicycle 在偵聽程式函數中前往它的前一個影格,讓 bicycle 影片片段向後播放,如下列程式碼所示:
// 觸發 enterFrame 事件時就會呼叫此函數,這表示
// 每個影格都會呼叫它一次。
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 屬性則會傳回單一 FrameLabel 物件,代表最近在時間軸上所遇到的影格。
假設您已經建立了影片片段 robot 並且為它的一些動畫狀態加上標籤。您可以設定一個條件來檢查 currentLabel 屬性,以存取目前 robot 的狀態,如下列程式碼所示:
if (robot.currentLabel.name == "walking"
{
// 執行作業
}
Flash CS3
目前頁面: http://livedocs.adobe.com/flash/9.0_tw/main/00000212.html