將物件製成動畫

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

動畫是讓事物移動的程序,也可以說,是讓事物隨著時間變更。以指令碼編寫的動畫是電玩遊戲的基礎部分,而且經常會用來修飾或是將有用的互動線索加入至其它應用程式。

以指令碼編寫之動畫背後的基本構想是畫面必須要產生變化,而且這個變化必須依時間劃分增量。在 ActionScript 中,只要使用一般迴圈陳述式便可以輕鬆地重複動作。但是,迴圈會在執行循環中所有項目之後,才會更新顯示畫面。因此若要以程式碼建立動畫,您必須撰寫 ActionScript,在一段時間內重複執行一些動作,而且每次執行時都會更新螢幕。

例如,想像一下您要建立簡單的動畫,如讓一個球滾過整個螢幕。ActionScript 包含簡單的機制,可以讓您追蹤時間的推移,並據此更新螢幕。也就是說,您可以撰寫每次將球移動一點點的程式碼,一直到它到達目的地為止。每次移動過後,螢幕都會更新,讓檢視者看見橫越「舞台」的動作。

從實際的觀點來看,將以程式碼建立的動畫與 SWF 檔的影格速率同步化是很合理的 (換句話說,讓一個動畫在每次顯示或要顯示新影格時變更),因為這會定義 Flash Player 或 AIR 更新螢幕的頻率。每個顯示物件都有 enterFrame 事件,根據 SWF 檔的影格速率傳送,一個事件一個影格。大部分開發人員以程式碼建立動畫時,都會使用 enterFrame 事件,建立在一段時間內重複的動作。您可以撰寫偵聽 enterFrame 事件的程式碼,將製成動畫的球在每個影格中移動一定的量,而且當螢幕 (每個影格) 更新時,球會在新位置上重新繪製,而產生動作。

備註: 另外還有一種方式可以在一段時間內重複執行動作,就是使用 Timer 類別。Timer 實體會在每次經過指定的時間後觸發事件通知。您可以撰寫程式碼,透過處理 Timer 類別的 timer 事件,將時間間隔設定為很小的值 (幾分之一秒) 來執行動畫。如需有關使用 Timer 類別的詳細資訊,請參閱 控制時間間隔

在下列範例中,會在「舞台」上建立名為 circle 的圓形 Sprite 實體。當使用者按一下圓形時,以指令碼編寫的動畫序列即開始進行,使得 circle 淡出 (其 alpha 屬性會減少) 直到完全透明為止:

import flash.display.Sprite; 
import flash.events.Event; 
import flash.events.MouseEvent; 
 
// draw a circle and add it to the display list 
var circle:Sprite = new Sprite(); 
circle.graphics.beginFill(0x990000); 
circle.graphics.drawCircle(50, 50, 50); 
circle.graphics.endFill(); 
addChild(circle); 
 
// When this animation starts, this function is called every frame. 
// The change made by this function (updated to the screen every 
// frame) is what causes the animation to occur. 
function fadeCircle(event:Event):void 
{ 
    circle.alpha -= .05; 
     
    if (circle.alpha <= 0) 
    { 
        circle.removeEventListener(Event.ENTER_FRAME, fadeCircle); 
    } 
} 
 
function startAnimation(event:MouseEvent):void 
{ 
    circle.addEventListener(Event.ENTER_FRAME, fadeCircle); 
} 
 
circle.addEventListener(MouseEvent.CLICK, startAnimation);

當使用者按一下圓形時,函數 fadeCircle() 會訂閱做為 enterFrame 事件的偵聽程式,表示從這時開始,每進入一個影格都會呼叫一次這個函數。該函數會透過變更其 alpha 屬性淡出 circle ,因此每個影格圓形的 alpha 減少 .05 (5%) 以後,螢幕就會更新。最後,當 alpha 值為 0 ( circle 完全透明) 時, fadeCircle() 函數即移除,不再為事件偵聽程式,而結束動畫。

例如,您可以使用相同的程式碼,建立動畫動作,而不進行淡出。在成為 enterFrame 事件偵聽程式的函數中,以另一個屬性取代 alpha ,就會改為建立該屬性的動畫。例如,將下列這一行

    circle.alpha -= .05;

變更為下面這行程式碼

    circle.x += 5;

就會建立 x 屬性的動畫,使得圓形向右移過「舞台」。結束動畫的條件可以變更為在達到所要的 x 座標時結束動畫 (也就是,取消訂閱 enterFrame 偵聽程式)。