秦偉
摘要:在編寫Actionnscrip3.0腳本中,經(jīng)常涉及到間隔循環(huán)執(zhí)行某些任務的情況,通??梢允褂肨imer對象、eventFrame事件、setInterval()函數(shù)以及setTimeout()函數(shù)4種形式實現(xiàn)循環(huán)執(zhí)行任務的功能。文章通過分析四種形式的運行機制及異同點,實例解析其功能為使用和選擇各種方法來為編程實踐提供參考。
關(guān)鍵詞:Actionnscrip;循環(huán);定時
中圖分類號:TP311 文獻標識碼:A 文章編號:1009-3044(2014)18-4305-02
Strategy of Selecting Four Cycle Task Execution Method in AS3
QIN Wei
(College of Education Science, Tongren University, Tongren 554300, China)
Abstract: When the Actionnscrip3.0 script is programmed, we often face conditions of interval loop to perform certain tasks, you can often use 4 kinds form of the Timer object, eventFrame events, setInterval () function and setTimeout () function to achieve function of circular task execution. Through four forms of the analysis of the operation mechanism and the differences and similarities, example analysis for its function provide reference for programming practice as the selection and use of various methods.
Key words: Actionnscrip; Loop; Time
1 概述
Actionnscrip3.0(簡稱As3)是一種強大的面向?qū)ο缶幊陶Z言,設計 As3 的意圖是創(chuàng)建一種適合快速地構(gòu)建效果豐富的互聯(lián)網(wǎng)應用程序語言,這種語言以支持類型安全、代碼維護輕松、編寫簡單、響應高效等優(yōu)點已成為 Web 體驗的重要部分[1]。在使用Flash軟件進行設計與制作過程中經(jīng)常涉及到使用As3腳本語言來實現(xiàn)間隔循環(huán)執(zhí)行某一任務的代碼設計,由于Flash軟件本身的特性,我們習慣采用的循環(huán)語句while,for等語句來實現(xiàn)這些需求是不太容易的,所以了解Timer對象、eventFrame事件、setInterval()函數(shù)以及setTimeout()函數(shù)四種形式的原理機制及特性對實現(xiàn)循環(huán)執(zhí)行任務的功能是非常重要的。
2 運行原理解析
2.1 Timer對象
通過構(gòu)造Timer對象的實例的同時設置好delay,repeatCount兩個參數(shù)來設置延遲時間和重復次數(shù),delay的設置以毫秒計,設置好這兩個參數(shù)后就會按照設置的時間延遲定時循環(huán)執(zhí)行已編好的代碼。如:
var timer:Timer = new 函數(shù)名(時間間隔,重復次數(shù));
timer.addEventListener(TimerEvent.TIMER, 函數(shù)名);
function函數(shù)名(event:TimerEvent):void{函數(shù)體}
調(diào)用start()方法啟動timer實例:timer.start();
2.2 eventFrame事件
Event對象中的ENTER_FRAME公共常量實現(xiàn)該功能主要是通過幀頻來實現(xiàn)。每當Flash運行器執(zhí)行一次預定屏幕更新檢查的時候它調(diào)度Event.ENTER_FRAME事件。注冊以接收Event.ENTER_FRAME通知的任何函數(shù)都被反復執(zhí)行。由任何Event.ENTER_FRAME事件監(jiān)聽器做出的可見變化在它退出之前被描繪,這就是Event.ENTER_FRAME做動畫的原理。如:
stage.addEventListener(Event.ENTER_FRAME, 函數(shù)名);
function函數(shù)名(e:Event):void {函數(shù)體}
2.3 setInterval()函數(shù)
setInterval動作的作用是在播放動畫的時,每隔一定時間就調(diào)用函數(shù),方法或?qū)ο?。setInterval有兩種語法格式。
格式一:setInterval(函數(shù)名,時間間隔[arg1,arg2,..argn]), arg1,arg2,..argn為傳遞給函數(shù)的參數(shù)。如:
function 函數(shù)名(){函數(shù)體} setInterval(函數(shù)名,時間間隔);
格式二:setInterval(對象名,方法名,時間間隔[,arg1,arg2,.....argn]),其中對象名參數(shù)指定從Object對象派生的對象,方法名制定object參數(shù)中要調(diào)用的方法。arg1,arg2,..argn為傳遞給函數(shù)的參數(shù)。如:
myobj=new Object(); myobj.interval=函數(shù)名(){函數(shù)體}
setInterval(myobj,"interval",時間間隔);
2.4 setTimeout()函數(shù)
setTimeout()函數(shù)的使用方法與setlnterval()函數(shù)的使用方法相同,在指定的延遲(以毫秒為單位)后運行指定的函數(shù)。setTimeout()函數(shù)的一般形式為:endprint
setTimeout(函數(shù)名,時間間隔,函數(shù)參數(shù));
function 函數(shù)名() {函數(shù)體 }
setTimeout(函數(shù)名,時間間隔);
3 四種形式的異同點與選擇策略
1)對于一般的應用程序,當幀代碼量不大,執(zhí)行代碼的時間小于幀頻且執(zhí)行幀代碼的時間都小于Timer對象、eventFrame事件、setInterval()函數(shù)以及setTimeout()函數(shù)方法設定的時間間隔時,你選用那一種方法都是可以的,如下面實例中雪花的下落是間隔執(zhí)行的,通過四種方法調(diào)用Snow類實現(xiàn)下雪效果:首先編寫Snow.as的類文件,代碼如下:
package{ import flash.display.*; import flash.events.*;
public class Snow extends Sprite{ public function Snow(){函數(shù)體}},
在Snow.as類文件的相同目錄下,編寫xh.fla文檔,在xh.fla文檔的第一幀編寫幀代碼都能實現(xiàn)調(diào)用上面的Snow類實現(xiàn)下雪效果,且他們的效果及執(zhí)行時間沒有多大區(qū)別。四種方法編寫的代碼如下:
使用Timer對象實現(xiàn):
import Snow; var timer:Timer = new Timer(1,1000); timer.start();
timer.addEventListener(TimerEvent.TIMER,函數(shù)名);
function函數(shù)名(e:TimerEvent):void
{var xh:Snow=new Snow(); addChild(xh); }
使用eventFrame事件實現(xiàn):
import Snow; stage.addEventListener(Event.ENTER_FRAME,函數(shù)名);
function 函數(shù)名(e:Event):void {var xh:Snow=new Snow(); addChild(xh);}
使用setInterval()函數(shù)實現(xiàn):
import Snow; setInterval(函數(shù)名,50);
function 函數(shù)名():void { var xh:Snow=new Snow(); addChild(xh); }
使用setTimeout()函數(shù)實現(xiàn):
import Snow; setTimeout (函數(shù)名,50);
function 函數(shù)名():void { var xh:Snow=new Snow(); addChild(xh); }
2) 盡管Timer、setTimeout()函數(shù)、setInterval()函數(shù)看似提供了一個完全隨意的方式來在一個間隔時間之后執(zhí)行一個函數(shù),但它們?nèi)稳灰蕾囉贔lash運行器的幀速率。對于setTimeout()函數(shù)、setInterval()函數(shù)如果時間間隔大于Flash運行器的幀速率,會以幀速率調(diào)用函數(shù)。對于Timer當一個TimerEvent.TIMER事件設置為運行得比幀速率更不頻繁的時候,它將執(zhí)行于下一次預定屏幕更新的時間間隔之后。為了請求更新于下次預定更新前,必須使用TimerEvent類的實例方法updateAfterEvent()。所以在基于速度的動畫制作選用Timer、setTimeout()函數(shù)、setInterval()函數(shù)來實現(xiàn)間隔執(zhí)行任務是沒有多大區(qū)別的,在高版本的腳本中多選用Timer對象來實現(xiàn)該功能。
3) 在必須使程序內(nèi)容的顯示同步于手工創(chuàng)建的基于幀內(nèi)容的顯示的基于內(nèi)容的腳本設計中,多使用eventFrame事件。且在Flash運行器中的幀速率的變動當做是可以接受的時候,也多使用eventFrame事件。因為使用基于eventFrame事件的動畫代碼一般要比基于Timer、setTimeout()函數(shù)、setInterval()函數(shù)更簡單和使用較少的內(nèi)存。
4)特別對于Timer對象,避免使用單個的Timer對象來移動單個的顯示對象。只要有可能,使用一個單個的Timer對象來編制所有的動畫。當然如果你想在不同時間更新不同的對象,單獨的Timer對象可能更合適。
5) 四種方式執(zhí)行間隔循環(huán)后都應用相應的方式結(jié)束執(zhí)行任務,要不會出現(xiàn)內(nèi)存被大量占用,函數(shù)重復調(diào)用等問題使動畫運行不流暢。一般結(jié)束Timer對象的方法用Timer實例的stop()方法;結(jié)束eventFrame事件用removeEventListener()函數(shù)來刪除;清除setInterval()的調(diào)用,使用clearInterval()函數(shù);清除setTimeout()的調(diào)用,使用clearTimeout()函數(shù)。
4 結(jié)束語
總之,對于任何一門語言設計代碼時都應了解該語言的一些基本語法,各種語句及函數(shù)的用法。在As3中對Timer對象、eventFrame事件、setInterval()函數(shù)以及setTimeout()函數(shù)的原理機制及各種方法及特征有一定的認識才能在設計間隔循環(huán)執(zhí)行任務時使自己編寫的腳本更簡單、高效。
參考文獻:
[1] (美)溫妮,著,羅楷,譯.ActionScript 3.0基礎教程[M].北京:人民郵電出版社,2012:11-20.endprint