as3 定時器用法

關鍵字: flas actionscript3.0

雖 然Flash擁有越來越強大的周邊功能,但其核心依然是一款動畫製作軟件。在Flash設計環境中,不編寫腳本代碼,也能快速製作出效果驚人的時間軸動 畫。但此類動畫是固定的,無法根據環境動態調整。使用ActionScript生成和控制動畫,才能隨心駕馭動畫的細節,並完成仿真運動和用戶交互等高級 功能。

動畫定時器

高級語言都會提供定時器,AS3更不例外。在腳本代碼中,可以通過設置定時器控制動畫幀率。

動畫要素

動畫是利用人眼視覺殘留的特性來完成對真實世界運動的模擬。動畫必須包含三個要素:對象、幀率、軌跡。

毫無疑問,任何動畫都需要有對象。通過後期的編輯和組合,在一個場景裏最終可以存在多個運動對象。但在動畫設計階段必須單獨處理,每次只操作一個對象。

幀率(FrameRate)表示動畫影片在單位時間 內播放的動畫幀數量。幀率越高,動畫的表現就越平滑。但幀率也並不是越高越好,在Flash動畫中,過高的時間軸幀率會耗費更多的系統資源。時快時慢的高 幀率動畫反而不如較低幀率的流暢動畫。一般而言,動畫達到24幀/秒的幀率就已經很流暢平滑了。對於一串動畫序列,通過改變幀率,可以調節動作的快慢。

軌跡則是一個抽象概念,主要描述動畫對象在單位時間內的屬性變化情況。在以時間爲x 軸,屬性爲y 軸的平面座標系中,軌跡能被圖像化的繪製出來。

軌跡不僅是描述對象空間運動的,也可以描述顏色、透明度、形狀、大小等各種屬性的變化。一個動畫對象在時間線內alpha透明度的變化軌跡如圖8-1所示。

根據動畫的不同,軌跡的圖像可以是線性的,也可以是非線性的;軌跡可以是連續平滑的,也可以是隨機分佈的。總而言之,軌跡就是描述運動對象屬性變化情況的一個數據序列。

在創建Flash時間軸動畫時,動畫幀率與 Flash項目的默認幀率相同。要加速動畫對象的運動變化,只能通過改變軌跡實現。具體有兩種辦法:一種是增加單位時間內屬性的變化量,一種是減少單位變 化量需要的時間。形象而言,提高跑步速度可以有兩種方式:或者在10秒內多跑幾米,或者是減少跑100米所需的時間。無論選擇何種方式,都可以達到相同的 效果。

Timer類

定時器類(TimerClass)是ActionScript 3.0的內置類,通過AS3的事件分發響應機制實現週期觸發。定時器是一個簡單卻又極爲常用的類,系統全面的掌握它是非常必要的。

Timer類的屬性如表8-1所示:

表8-1  Timer類的屬性

   

   

   

currentCount

int

統計定時器開始後累計觸發次數。該屬性爲只讀屬性,用戶不能改變

delay

Number

以毫秒爲單位的定時器延時週期。兩次定時器觸發時間之間的間隔。注意,一秒等於1000毫秒

repeatCount

int

總觸發次數,當累計觸發次數達到總觸發次數後,定時器就會停止

running

Boolean

定時器的運行狀態。定時器在運行則爲true,定時器停止或未啓動則爲false。注意該屬性爲只讀屬性,不能通過設置該屬性控制定時器狀態。對定時器進行操作必須使用它內置的方法

使用Timer類的構 造函數“Timer(delay:Number,repeatCount:int=0)”可以直接創建一個功能完備的定時器。此函數包含兩個參數,分別是 該類的delay屬性和repeatCount屬性。定時器創建後會保持停止,直到使用“start()”方法啓動後,纔會開始計時。

使用定時器

當定時器啓動後,會每隔delay週期發出timer事件,必須在代碼中設定對此事件的偵聽,方可達到定時執行任務的目的。

var myTimer:Timer=new Timer(80,100);

myTimer.addEventListener("timer", timerhandler);//注意,事件timer必須全部小寫

myTimer.start();

//事件處理函數

function timerhandler(event:TimerEvent):void{

//進行用戶操作

}

以上代碼創建了一個總 觸發次數爲100次的定時器myTimer。當myTimer啓動後,每隔80毫秒會發出一次定時器觸發事件。用 “addEventListener()”函數設定timer事件的監聽,並編寫timerhandler()來處理這個事件。一切就緒後,使用 “start()”方法啓動定時器。

在定時器啓動後,使用currentCount屬性 查詢當前累計觸發次數,使用“stop()”方法可以停止一個定時器。需要指出的是:“stop()”方法不過是暫停了定時器,並沒有清除定時器。當一個 定時器被“stop()”方法停止後,Timer對象的currentCount並沒有被清除。當再次使用“start()”方法啓動Timer對象時, 定時器將繼續執行,直到觸發次數達到repeatCount屬性規定的數值。用戶不能在代碼中爲CurrentCount賦值,要改變 currentCount屬性,只能使用“reset()”方法。“reset()”方法可以清零定時器的currentCount屬性。

當一個定時器的觸發次數達到設定值repeatCount時,FlashPlayer將發送timeComplete事件。通過響應此事件,可以重設Time定時器並令其繼續運行下去。

用戶可以同時設定多個定時器。多個定時器之間平行存在,互不影響。

精確性

Timer定時器是精確的,但是定時器的執行結果並 非絕對精確。無論是Flash還是Flex,最終的應用程序都是以SWF文件存儲。而FlashPlayer在解釋SWF文件時,會建立基於幀率的週期循 環。每次舞臺更新的時間間隔是固定的,腳本中的舞臺操作會受到時間軸幀率的制約。

作爲一個多線程的應用程序,FlashPlayer 執行腳本不需要依賴幀率,但是所有的屏幕輸出都要藉助FlashPlayer的渲染引擎。如果時間軸幀率爲10,則運行時舞臺每100毫秒播放一幀。當間 隔爲80毫秒的定時器觸發時,SWF應用程序立刻執行該定時器的偵聽函數,但是在定時器偵聽函數中的任何屏幕操作,都不會及時的反應在舞臺上。只有在 100毫秒時,FlashPlayer纔會更新舞臺顯示。定時器在160毫秒第二次觸發時,SWF應用程序需在200毫秒更新舞臺顯示。理論上8000毫 秒內執行100次定時器,但實際上在幀率爲10的SWF應用中,舞臺更新只有80次。有可能在舞臺刷新間隔內,連續執行兩次定時器操作。

定時器的觸發事件間隔可以自由設置,所有的定時器事件都不會錯過。屏幕顯示雖然不是實時更新,但是由於刷新的速度很快,不會造成顯著影響。實際上,任何語言的定時器都要受制於系統時鐘,都不是絕對精確的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章