




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
Flash
基礎(chǔ)理論課第二章ActionScript3.0基礎(chǔ)Ⅰ-電腦資料
動(dòng)畫(huà)返回“Flash基礎(chǔ)理論課-目錄”類和面向?qū)ο缶幊填?Class)和面向?qū)ο?ObjectOriented),關(guān)于有些讀者來(lái)說(shuō)可能還沒(méi)接觸過(guò)而有些讀者可能已經(jīng)在AS(或其余語(yǔ)言)中使用過(guò)好多年了,為了讓大家都能學(xué)會(huì),我會(huì)簡(jiǎn)要的介紹一下這些基礎(chǔ)知識(shí),一個(gè)類最基本的兩個(gè)部分:屬性(數(shù)據(jù)或信息),行為(動(dòng)作或它能做的事)。屬性(Property)指用于保留與該類有關(guān)的信息變量,行為(Behavior)就是指函數(shù),如果一個(gè)函數(shù)是這個(gè)類中的一部分,那么我們就稱它為方法(Method)。一個(gè)基本的類:常用Flash的朋友都知道,我們能夠在庫(kù)中創(chuàng)立一個(gè)元件,用這個(gè)元件能夠在舞臺(tái)上創(chuàng)立出好多的實(shí)例。與元件和實(shí)例的關(guān)系相同,類就是一個(gè)模板,而對(duì)象(好像實(shí)例)就是類的一個(gè)特殊表現(xiàn)形式。下面來(lái)看一個(gè)類的例子:package{publicclassMyClass{publicvarmyProperty:Number=100;publicfunctionmyMethod( ){trace("Iamhere");}}}先來(lái)說(shuō)明一下這段代碼。在這里有些新的知識(shí),關(guān)于AS2老手也如此:包的聲明。包(Package),作用就是把有關(guān)的類進(jìn)行分組。知道這一點(diǎn)就夠了,我們不再進(jìn)行深入的議論,本書(shū)的示例甚至不會(huì)用到包。Package這個(gè)重點(diǎn)字和一對(duì)大括號(hào)是必需有的,我們理解為默認(rèn)包,緊隨后來(lái)的就是類的定義。另一個(gè)變化是AS3.0中的類擁有了接見(jiàn)重點(diǎn)字。接見(jiàn)重點(diǎn)字是指:一個(gè)用來(lái)指定其余代碼是否可接見(jiàn)該代碼的重點(diǎn)字。public(公有類)重點(diǎn)字指該類可被外部任何類的代碼接見(jiàn)。本書(shū)中所有示例的類都是public的。在深入學(xué)習(xí)了AS3.0后,我們會(huì)發(fā)現(xiàn)不是所有類都是公有的,甚至還有多重的類,這些內(nèi)容高出了本書(shū)的討論范圍。本例中我們能夠看到,這個(gè)類的名字為MyClass,后邊跟一對(duì)大括號(hào)。在這個(gè)類中有兩種要素,一個(gè)是名為myProperty的變量,另一個(gè)是名為myMethod的函數(shù)。包(Package)在AS2中,使用整個(gè)包名來(lái)創(chuàng)立一個(gè)類,比如:classcom.friendsofed.makingthingsmove.Utils{}在AS3中,包名寫(xiě)在包的聲名處,類名寫(xiě)類的聲名處,比如:packagecom.friendsofed.makingthingsmove{publicclassUtils{}}導(dǎo)入(Import)想象一下,每次要使用這個(gè)類的方法時(shí)都要輸入com.friendsofed.makingthingsmove.Utils,是不是太過(guò)煩雜太過(guò)死板了。別擔(dān)心,import語(yǔ)句能夠解決這個(gè)問(wèn)題。在這個(gè)例子中,能夠把下面這句放在package中類定義的上面:importcom.friendsofed.makingthingsmove.Utils;。結(jié)構(gòu)函數(shù)(Constructor)結(jié)構(gòu)函數(shù)是指一個(gè)名字與類名相同的方法。當(dāng)該類被實(shí)例化時(shí),該函數(shù)會(huì)被自動(dòng)調(diào)用,也能夠傳入?yún)?shù),比如:首先,創(chuàng)立一個(gè)類:package{publicclassMyClass{publicfunctionMyClass(arg:String){trace("constructed");trace("youpassed"+arg);}}}然后,假定工作在FlashCS3IDE(集成開(kāi)發(fā)環(huán)境)中,在時(shí)間軸上創(chuàng)立該實(shí)例:varmyInstance:MyClass=newMyClass("hello");結(jié)果輸出:constructedyoupassedhello繼承(Inheritance)一個(gè)類能夠從另一個(gè)類中繼承(inherit)和擴(kuò)展(extend)而來(lái)。這就意味著它獲得了另一個(gè)類所有的屬性和方法(除了那些被private掩遮住的屬性)。所生成的子類(派生類)還能夠增加更多的屬性和方法,或更改父類(基類)已有的屬性或方法。要分別創(chuàng)立兩個(gè)類來(lái)實(shí)現(xiàn)(兩個(gè)獨(dú)立的.as文件),比如:package{publicclassMyBaseClass{publicfunctionsayHello( ):void{trace("HellofromMyBaseClass");}}}package{publicclassMySubClassextendsMyBaseClass{publicfunctionsayGoodbye( ):void{trace("GoodbyefromMySubClass");}}}不要忘記,每個(gè)類都必須在其自己的文件中,文件名為該類的類名,擴(kuò)展名.as,所以必須要有MyBaseClass.as文件和MySubClass.as文件。因此,在使用FlashCS3IDE時(shí),保留的FLA文件,要與這兩個(gè)類在同一個(gè)文件夾。下面代碼會(huì)生產(chǎn)兩個(gè)實(shí)例,把它寫(xiě)入時(shí)間軸看看會(huì)發(fā)生什么:varbase:MyBaseClass=newMyBaseClass( );base.sayHello( );varsub:MySubClass=newMySubClass( );sub.sayHello( );sub.sayGoodbye( );第一個(gè)實(shí)例沒(méi)什么可說(shuō)的,值得注意的是第二個(gè)實(shí)例中的sayHello方法,雖然在MySubClass中沒(méi)有定義sayHello,但它卻是繼承自MyBaseClass類的。另一個(gè)值得注意的是,增加了一個(gè)新的方法sayGoodbye,這是父類所沒(méi)有的。下面說(shuō)說(shuō),在子類中怎樣改變一個(gè)父類中已存在的方法。在AS2中,我們能夠只需要從頭定義這個(gè)方法就能夠了。而在AS3中,則必需明確地寫(xiě)出override重點(diǎn)字,來(lái)進(jìn)行從頭定義。package{publicclassMySubClassextendsMyBaseClass{overridepublicfunctionsayHello( ):void{trace("HolafromMySubClass");}publicfunctionsayGoodbye( ):void{trace("GoodbyefromMySubClass");}}}請(qǐng)注意,原來(lái)的sayHello方法被重寫(xiě),再調(diào)用MySubClass后,就有了新的信息。此外,私有成員也不能被重寫(xiě),因?yàn)樗鼈冎荒鼙凰鼈冏约旱念惤右?jiàn)。MovieClip/Sprite子類我們能夠自己寫(xiě)一個(gè)類,然后讓另一個(gè)類去繼承它。在AS3中,所有代碼都不是寫(xiě)在時(shí)間軸上的,那么它們一開(kāi)始都要繼承自MovieClip或Sprite。MovieClip類是電影剪輯對(duì)象屬性和方法的ActionScript.模板。它包括我們所熟悉的屬性如:電影的x,y坐標(biāo),縮放等,這些在AS3中的變化不大。AS3還增加了Sprite類,往常把它理解為不在時(shí)間軸上的電影剪輯。好多情況下,只使用代碼操作對(duì)象,并不波實(shí)時(shí)間軸和幀,這時(shí)就應(yīng)當(dāng)使用Sprite這個(gè)輕型的類。如果一個(gè)類繼承自MovieClip或Sprite,那么它會(huì)自動(dòng)擁有該類所有的屬性和方法,我們還能夠?yàn)檫@個(gè)類增加特殊的屬性和方法。比如,游戲設(shè)計(jì)一個(gè)太空船的對(duì)象,我們希望它擁有一個(gè)圖形,并且在屏幕的某個(gè)地點(diǎn)移動(dòng),旋轉(zhuǎn),并為動(dòng)畫(huà)增添enterFrame.偵聽(tīng)器,還有鼠標(biāo)、鍵盤(pán)的偵聽(tīng)等。這些都能夠由MovieClip或Sprite來(lái)達(dá)成,所以就要繼承自它們。同時(shí),還能夠增加一些屬性如:速度(speed)、油量(fuel)、破壞度(damage),還有像騰飛(takeOff)、墜落(crash)、射擊(shoot)或是自毀(selfDestruct)等方法。那么這個(gè)類大體是這樣的:package{importflash.display.Sprite;publicclassSpaceShipextendsSprite{privatevarspeed:Number=0;privatevardamage:Number=0;privatevarfuel:Number=1000;publicfunctiontakeOff( ):void{//...}publicfunctioncrash( ):void{//...}publicfunctionshoot( ):void{//...}publicfunctionselfDestruct( ):void{//...}}}注意,首先要導(dǎo)入flash.display包中的Sprite類,如果要導(dǎo)入MovieClip類,同樣也需要導(dǎo)入這個(gè)相同的包類。創(chuàng)立文檔類(Documentclass)現(xiàn)在我們對(duì)類已經(jīng)了一定的認(rèn)識(shí),接下來(lái),看看如果真實(shí)地使用它。有時(shí)候我常說(shuō)鑒于AS3的SWF是多么的重要,這是因?yàn)锳S3引入了一個(gè)全新的觀點(diǎn),文檔類(documentclass)。一個(gè)文檔類就是一個(gè)繼承自Sprite或MovieClip的類,并作為SWF的主類。讀取SWF時(shí),這個(gè)文檔類的結(jié)構(gòu)函數(shù)會(huì)被自動(dòng)調(diào)用。它就成為了我們程序的入口,任何想要做的事都能夠?qū)懺谏厦?,如:?chuàng)立電影剪輯,繪圖,讀取資源等等。如果在FlashCS3IDE中寫(xiě)代碼,可使用文檔類,也能夠選擇持續(xù)在時(shí)間軸上寫(xiě)代碼。但如果使用FlexBuilder2或免費(fèi)FlexSDK,那邊沒(méi)有時(shí)間軸,唯一的辦法就是寫(xiě)在類中。這些工作一切都圍繞著強(qiáng)大的文檔類而展開(kāi),沒(méi)有它就沒(méi)有SWF。以下是一個(gè)文檔類的框架:package{importflash.display.Sprite;publicclassTestextendsSprite{publicfunctionTest( ){init( );}privatefunctioninit( ):void{//寫(xiě)代碼處}}}如果你看過(guò)前面的部分,不會(huì)認(rèn)為這是個(gè)新知識(shí),只可是是把他們放在了一同而已。使用默認(rèn)包,導(dǎo)入并繼承Sprite類。結(jié)構(gòu)函數(shù)只有一句,調(diào)用init方法。自然,也能夠把所有代碼寫(xiě)在結(jié)構(gòu)函數(shù)里,可是要養(yǎng)成一個(gè)好習(xí)慣,就是盡量減少結(jié)構(gòu)函數(shù)中的代碼,所以把代碼寫(xiě)到了另一個(gè)方法中。本書(shū)會(huì)給大家好多代碼塊進(jìn)行測(cè)試,那時(shí)要像上面這個(gè)例子同樣把代碼塊放入init方法中,這樣在電影編譯履行時(shí),就會(huì)調(diào)用init中的代碼。下面我們要開(kāi)始學(xué)習(xí)怎樣連結(jié)文檔類和SWF。使用FlashCS3IDE(集成開(kāi)發(fā)環(huán)境)FlashCS3IDE是實(shí)現(xiàn)文檔類的最方便的工具。把上述的類選擇一個(gè)文件夾進(jìn)行保留,文件名為T(mén)est.as。翻開(kāi)FlashCS3,創(chuàng)立一個(gè)FLA文件,保留到一這個(gè)類相同的目錄下。確認(rèn)FLA默認(rèn)發(fā)布設(shè)置為FlashPlayer9及AS3.0。在屬性面板中,我們注意到出現(xiàn)了一個(gè)名為文檔類(DocumentClass)的地區(qū)(圖2-1)。只需輸入類名:Test。圖2-1設(shè)置文檔類請(qǐng)注意,我們輸入的是類名,而不是文件名。所以這里不需要輸入擴(kuò)展名.as。如果這個(gè)類海涵在一個(gè)包中,那么就需要輸入類的完整路徑——比如:。程序動(dòng)畫(huà)下面,再來(lái)學(xué)習(xí)一些AS3編程的基來(lái)源理。如果你已經(jīng)選擇好了一個(gè)開(kāi)發(fā)環(huán)境,那么就出發(fā)吧。讓我們進(jìn)入ActionScript動(dòng)畫(huà)世界。動(dòng)畫(huà)的履行過(guò)程幾乎所有的程序動(dòng)畫(huà)都包括幾種不同的履行過(guò)程。關(guān)于逐幀動(dòng)畫(huà)來(lái)說(shuō),意味著創(chuàng)立和存儲(chǔ)一組連續(xù)的位圖,每一幀都是一幅圖像,只需要進(jìn)行顯示即可,見(jiàn)圖2-3。圖2-3逐幀動(dòng)畫(huà)當(dāng)我們?cè)贔lash中使用圖形或元件時(shí),事情就發(fā)了微妙的變化。這時(shí),F(xiàn)lash不會(huì)為每一幀創(chuàng)立和存儲(chǔ)新的位圖。關(guān)于每一幀而言,F(xiàn)lash存儲(chǔ)的是舞臺(tái)上每個(gè)對(duì)象的地點(diǎn),大小,顏色等等。比方,一個(gè)小球在屏幕上移動(dòng),每一幀只存儲(chǔ)小球的在該幀上的地點(diǎn),第1幀小球的地點(diǎn)在左邊第10個(gè)像素,第2幀或許就在第15個(gè)像素,等等。Flash播放器(FlashPlayer)讀取這些信息,再根據(jù)這些信息的描繪來(lái)襯著舞臺(tái)并顯示該幀。根據(jù)這些變化擴(kuò)展一下流程圖,見(jiàn)圖2-4。圖2-4襯著并顯示幀我是這樣描繪一個(gè)動(dòng)向程序動(dòng)畫(huà)的,見(jiàn)圖2-5。圖2-5腳本動(dòng)畫(huà)如圖2-5所示,沒(méi)有第1幀、第2幀的觀點(diǎn),腳本動(dòng)畫(huà)往常只由一幀達(dá)成。下面我們就來(lái)看看動(dòng)畫(huà)的履行過(guò)程。首先,成立初始化。舞臺(tái)中放入一個(gè)電影剪輯,再創(chuàng)立補(bǔ)間動(dòng)畫(huà),或使用代碼來(lái)描繪整個(gè)場(chǎng)景。總之,最后都要對(duì)該幀進(jìn)行襯著及顯示。然后,應(yīng)用自定義規(guī)則。規(guī)則能夠像“讓球向右移動(dòng)5像素”這樣簡(jiǎn)單,也能夠是由幾十條復(fù)雜的三角函數(shù)組成。使用自定義規(guī)則會(huì)產(chǎn)生新的描繪再根據(jù)這些描繪進(jìn)行襯著及顯示,并不斷地應(yīng)用這個(gè)規(guī)則。請(qǐng)注意,同一規(guī)則被一遍又一遍地履行,而不是對(duì)第1幀用一套規(guī)則,而對(duì)第2幀又使用另一套規(guī)則,聽(tīng)起來(lái)很復(fù)雜,其實(shí)不然,這里所說(shuō)的“規(guī)則”,實(shí)際上就是ActionScript.代碼。每套規(guī)則都可由一行或多行代碼組成。下面是小球向右移動(dòng)5像素的例子:ball.x=ball.x+5;這句話是說(shuō)不論小球X坐標(biāo)(水平軸)在哪里,都在原來(lái)的X地點(diǎn)上增加5像素,并把該坐標(biāo)作為它的新X坐標(biāo)。也可簡(jiǎn)化為:ball.x+=5;“+=”操作符:把右邊的值與左邊的變量相加,相加的結(jié)果再賦值給該變量。以下是更多的高級(jí)規(guī)則,日后會(huì)學(xué)到:vardx:Number=mouseX-ball.x;vardy:Number=mouseY-ball.y;varax:Number=dx*spring;varay:Number=dy*spring;vx+=ax;vy+=ay;vy+=gravity;vx*=friction;vy*=friction;ball.x+=vx;ball.y+=vy;graphics.clear( );graphics.lineStyle(1);graphics.moveTo(ball.x,ball.y);graphics.lineTo(mouseX,mouseY);這段現(xiàn)在看不懂沒(méi)關(guān)系,大家只需知道Flash會(huì)在每一幀中生成這段代碼,并不斷地履行。怎樣讓它循環(huán)履行?看看我第一次的嘗試,這也是好多AS初學(xué)者都會(huì)犯的錯(cuò)誤。這是在好多程序設(shè)計(jì)語(yǔ)言中都存在的循環(huán)結(jié)構(gòu),如for和while。用循環(huán)結(jié)構(gòu)使代碼重復(fù)履行,這就是我曾寫(xiě)的那段:for(i=0;i<500;i++){ball.x=i;}看起來(lái)相當(dāng)簡(jiǎn)單。變量i從0開(kāi)始,所以小球X坐標(biāo)移動(dòng)到0——舞臺(tái)最左邊。i++讓i的值每次增長(zhǎng)1,即:0~1~2~3~4,每次這個(gè)值都會(huì)做為ball.x的值,把小球從左向右移動(dòng)。當(dāng)值為500時(shí),表達(dá)式i<500值為假(false),循環(huán)結(jié)束。如果你也犯過(guò)同樣的錯(cuò)誤,就會(huì)知道,小球沒(méi)有在舞臺(tái)上發(fā)生移動(dòng)——只是一下子出現(xiàn)在了舞臺(tái)的右邊而已。為什么沒(méi)有移動(dòng)到中間的那些點(diǎn)上?其實(shí)它移動(dòng)了,只是我們沒(méi)有看到,因?yàn)槲覀儧](méi)有讓Flash去刷新屏幕。圖2-6為另一個(gè)流程圖,看看實(shí)際都發(fā)生了什么。圖2-6為什么循環(huán)結(jié)構(gòu)無(wú)法產(chǎn)生動(dòng)畫(huà)實(shí)際上我們使用自定義規(guī)則使球移動(dòng)到指定地點(diǎn),并創(chuàng)立了500次新的場(chǎng)景。但在循環(huán)結(jié)束從前沒(méi)有給出顯示,這是因?yàn)镕lash只在每一幀結(jié)束后才進(jìn)行一次刷新,這點(diǎn)很重要。以下是Flash進(jìn)入幀的動(dòng)作次序:在舞臺(tái)上放置所有的對(duì)象,不論在何級(jí),何層,或是否為加載的電影。履行幀上所有的Action腳本(ActionScript),不論在何級(jí),何層,不論處于電影剪輯仍是按鈕中,也不論它嵌套在哪處。判斷是否到了該顯示的時(shí)候。如果設(shè)置幀頻為20幀/秒,F(xiàn)lash最少要等上一幀顯示后50毫秒后再進(jìn)行下一次顯示,顯示了該幀后,就要編譯和進(jìn)入下一幀。如果幀頻沒(méi)有到20幀/秒,那么要等待到正確的時(shí)間再去履行。準(zhǔn)時(shí)時(shí)間存在著一些問(wèn)題。首先,盡人皆知幀頻是不精準(zhǔn)的(即便在Flash9中),不要依靠它作為精準(zhǔn)的準(zhǔn)時(shí)器。其次,在大量的編譯和AS履行花費(fèi)的時(shí)間會(huì)高出規(guī)定的時(shí)間。只管如此,我們也不必?fù)?dān)心自己的腳本會(huì)被砍掉一部分。在進(jìn)入第3步從前,F(xiàn)lash會(huì)達(dá)成所有可履行代碼(第2步),即便需要延緩幀頻也要達(dá)成。Flash為了能達(dá)成腳本,甚至?xí)壬?5秒。在上面的例子中,F(xiàn)lash等待循環(huán)結(jié)束,然后進(jìn)入下一幀,只在跳轉(zhuǎn)到下一幀時(shí)進(jìn)行屏幕的刷新。這就是為什么我們看到的是跳動(dòng)而不是移動(dòng)。因此,要想達(dá)成移動(dòng),我們所要做的就是打散這個(gè)循環(huán),請(qǐng)回過(guò)頭參照?qǐng)D2-5。幀循環(huán)幀循環(huán)的理念,存在于Flash最早的版本中,那時(shí)ActionScript.還不像今天那么強(qiáng)大。把代碼寫(xiě)入重點(diǎn)幀,并在下一幀中寫(xiě)入像gotoAndPlay這樣的語(yǔ)句,使播放頭(playhead)回到前一幀。這樣兩幀之間就形成了一個(gè)無(wú)限循環(huán),每當(dāng)播放頭到了代碼幀上時(shí),就會(huì)履行那些代碼。比如,在舞臺(tái)上有一個(gè)實(shí)例名為ball的電影剪輯。第一幀的代碼就像這樣:ball.x++;第二幀的代碼如下:gotoAndPlay(1);實(shí)際上第二幀不需要做任何事,只是讓時(shí)間軸自動(dòng)回到第一幀而以。另一個(gè)版本是成立三個(gè)幀,第一幀進(jìn)行初始化,寫(xiě)入只履行一次的代碼,不進(jìn)行循環(huán)。第二幀才是主要的履行代碼,第三幀只寫(xiě)gotoAndPlay(2);這個(gè)方法在早期Flash版本中常被使用,雖然有點(diǎn)過(guò)時(shí),可是同樣能夠優(yōu)秀地達(dá)成任務(wù)。馬上我們還要學(xué)到更靈活更強(qiáng)大的設(shè)置方法,但此后你會(huì)發(fā)現(xiàn)其實(shí)原理上是同樣的。電影事件電影事件在AS3中徹底的消失了,這真是件好事。但還要捎帶提一下,回首Flash5的時(shí)代,只有幀循環(huán)和電影剪輯事件兩種選擇。電影事件指代碼直接寫(xiě)在電影剪輯上,而不是幀上。怎樣實(shí)現(xiàn)電影事件,首先選擇舞臺(tái)上的電影剪輯,然后翻開(kāi)動(dòng)作面板并將代碼寫(xiě)在上面,這些代碼只對(duì)該電影剪輯有效。所有代碼必需寫(xiě)在事件塊中,比方:onClipEvent(eventName){//codegoeshere}關(guān)于onClipEvent(eventName),作用于eventName(某種事件)。關(guān)于"on"種類事件則必需指定鼠標(biāo)或鍵盤(pán)事件,如按下(press)和釋放(release)。事件名稱(eventName)是指很多Flash電影事件之一,所謂事件就是在電影中發(fā)生的事。事件分為兩種:系統(tǒng)事件和用戶事件。系統(tǒng)事件指發(fā)生在如計(jì)算機(jī),F(xiàn)lash,或電影上的事件,比方調(diào)取數(shù)據(jù),調(diào)取信息,或播放幀等。用戶事件是指用戶所做的一些事,基本上就是鼠標(biāo)和鍵盤(pán)兩種。電影事件使用得最多的就是load和enterFrame.這兩個(gè)。Load事件會(huì)在電影第一次出現(xiàn)在舞臺(tái)上時(shí)才履行,且只履行一次。所以說(shuō)特別適合在這里面寫(xiě)入初始化代碼。只需把代碼寫(xiě)在大括號(hào)間即可:onClipEvent(load){//initializationcode}我們能夠把帶有如下代碼的電影剪輯放入時(shí)間軸上(注意:此處為AS1寫(xiě)法):onClipEvent(load){this._x=100;this._y=100;}onClipEvent(enterFrame){this._x+=5;}本書(shū)示例中的代碼不使用這種寫(xiě)法(因?yàn)樗呀?jīng)不是一種語(yǔ)言了),但不論使用何種方法,初始化(initialization),重復(fù)動(dòng)作(repeatingactions)和屏幕刷新(screenrefresh)都是特別重要的。事件及事件辦理FlashMX的ActionScrpt發(fā)生了重要的改變,這些轉(zhuǎn)變與改革為Flash成為真實(shí)的富客戶端程序(RIA)確立了基礎(chǔ)。其中一個(gè)就是全新的事件結(jié)構(gòu),在編寫(xiě)特別復(fù)雜的行為時(shí)比從前的版本好用好多。FlashMX從前的版本,只能把代碼放在電影和按鈕的onClipEvent(eventName)或on(eventName)這兩種事件辦理方法中。這就意味著,在設(shè)計(jì)的時(shí)候就要把電影剪輯放到舞臺(tái)上,并把代碼寫(xiě)入電影剪輯中。MX的事件結(jié)構(gòu)并不完美,但與從前版本來(lái)說(shuō)已經(jīng)有了長(zhǎng)足的進(jìn)步,并允許我們?cè)谌魏螘r(shí)候接見(jiàn)任何事件,或是停止辦理任何事件,或是動(dòng)向改變某個(gè)事件的行為,能夠想象這有多么的強(qiáng)大和靈活。要想認(rèn)識(shí)事件,就要理解下面幾條觀點(diǎn):偵聽(tīng)器(listener)與辦理函數(shù)(handler),這兩個(gè)名字很貼切,偵聽(tīng)器就是偵聽(tīng)事件的對(duì)象,辦理函數(shù)是一個(gè)用于辦理所要發(fā)生的事件的函數(shù)。偵聽(tīng)與辦理在ActionScript.的發(fā)展過(guò)程中進(jìn)行過(guò)好多次演變,在AS2中就有好多不同的實(shí)現(xiàn)方法。為了防止雜亂,我很推崇AS3,因?yàn)樗?jiǎn)化了這個(gè)過(guò)程,使事件辦理變得更方便更一致。事件偵聽(tīng)器與辦理函數(shù)前面說(shuō)過(guò),偵聽(tīng)器是一個(gè)用于偵聽(tīng)事件的對(duì)象。我們能夠設(shè)計(jì)一個(gè)類,經(jīng)過(guò)調(diào)用addEventListener函數(shù)為某事件指定一個(gè)偵聽(tīng)器。輸入要偵聽(tīng)的事件名稱以及要履行辦理的函數(shù)名稱。看一個(gè)例子:addEventListener("enterFrame",onEnterFrame);在加入事件偵聽(tīng)器時(shí),可使用可選參數(shù),本書(shū)中不會(huì)用到;關(guān)于大部分的應(yīng)用程序來(lái)說(shuō),會(huì)使用以上這種寫(xiě)法就夠用了。請(qǐng)注意事件名"enterFrame"為字符串型,戲稱它為“魔力字符串”(MagicString)。為什么這么叫?如果你誤輸入成了"entorFrame",只管沒(méi)有這個(gè)事件名稱,編譯器也會(huì)編譯履行它,會(huì)發(fā)現(xiàn)事件辦理函數(shù)沒(méi)有履行。但AS3仍會(huì)對(duì)其進(jìn)行辦理,除了使用“魔力字符串”以外,還能夠使用事件類(EventClass)的屬性。比如:addEventListener(Event.ENTER_FRAME,onEnterFrame);實(shí)際上Event.ENTER_FRAME的.值就是”enterFrame”這個(gè)字符串。那么這個(gè)屬性也可能輸錯(cuò)就像Event.ENTOR_FRAME,.但這種方法幸虧,如果輸入錯(cuò)誤了,程序會(huì)拒絕編譯,并提示你在事件類中不存在該屬性。編譯器會(huì)提示發(fā)生錯(cuò)誤的行及切實(shí)的字符。所以,最好使用這種方法,除非編譯器會(huì)幫我們修正錯(cuò)誤或編寫(xiě)代碼。除此之外,還有其余的事件種類如:MouseEvent.MOUSE_DOWN,KeyboardEvent.KEY_DOWN,TimerEvent.TIMER等。這些都由"mouseDown","keyDown","timer"這樣的簡(jiǎn)單字符串來(lái)表示,如果你記不住這些字符串,那么最好就去使用事件類的屬性。另一個(gè)重點(diǎn)是,使用addEventListener函數(shù)直接調(diào)用類中的函數(shù)。有時(shí),需要偵聽(tīng)另一個(gè)對(duì)象產(chǎn)生的事件,比如,有一個(gè)名為mySpriteButton的Sprite電影(Sprite):電影或按鈕,能達(dá)成按鈕的動(dòng)作。當(dāng)用戶點(diǎn)擊它的時(shí)候就會(huì)產(chǎn)生mouseDown(鼠標(biāo)按下)事件。偵聽(tīng)該Sprite電影的mouseDown事件,就要調(diào)用該對(duì)象的addEventListener方法,如下:mySpriteButton.addEventListener(MouseEvent.MOUSE_DOWN,onSpritePress);最后一點(diǎn),必需要有事件辦理函數(shù)如onEnterFrame,在AS3中,能夠隨意地為事件辦理函數(shù)命名,這點(diǎn)與從前的ActionScript不同。在enterFrame.示例中,使用onEnterFrame.做事件辦理函數(shù),是因?yàn)槲覀兞?xí)慣使用這個(gè)名稱。在AS3中,onEnterFrame.已不再是重點(diǎn)字,自然也能夠?yàn)檫@個(gè)辦理函數(shù)命名為move,run,或是doSomethingCool。但是,我們已經(jīng)習(xí)慣使用”on”表示事件開(kāi)始,后邊跟一些描繪詞如onStartButtonClick,onConfigXMLLoad或onRoketCrash。有些朋友喜歡在事件名后邊加上"Handler"作為后綴,如:enterFrameHandler,這只是個(gè)人偏好問(wèn)題。偵聽(tīng)器用于偵聽(tīng)事件,但關(guān)于一個(gè)偵聽(tīng)器來(lái)說(shuō),或許會(huì)同時(shí)偵聽(tīng)好多事件。在系統(tǒng)內(nèi)部,一個(gè)事件對(duì)象擁有一個(gè)包括了所有對(duì)象及自己的偵聽(tīng)器的列表。如果一個(gè)對(duì)象能夠產(chǎn)生多種不同種類的事件,如mouseDown,mouseUp,mouseMove等,那么它就擁有一個(gè)偵聽(tīng)器列表,其中包括它所波及的所有種類的事件。不論觸發(fā)何種事件,都會(huì)檢索一遍列表,然后使列表中的每個(gè)對(duì)象都知道所發(fā)生的事件。另一種對(duì)事件的描繪是,將其看作一個(gè)加入到事件隊(duì)列的偵聽(tīng)器成員。產(chǎn)惹禍件的對(duì)象將它所產(chǎn)生的事件宣布給所有成員,當(dāng)你不再需要這個(gè)對(duì)象進(jìn)行偵聽(tīng)時(shí),能夠令其停止偵聽(tīng)或使用removeEventListener方法排除該成員;就是
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 網(wǎng)絡(luò)公共服務(wù)平臺(tái)在志愿者服務(wù)體系建設(shè)中的促進(jìn)作用考核試卷
- 濟(jì)職面試真題及答案
- 《建筑美學(xué)與結(jié)構(gòu)設(shè)計(jì)》課件
- 巖石力學(xué)研究生課件
- 《高級(jí)建筑師》課件
- 《并購(gòu)重組》課件 - 深度解析企業(yè)并購(gòu)與重組策略
- 《認(rèn)知功能障礙課件大全》
- 《消防救援技能培訓(xùn)課件優(yōu)化與實(shí)踐》
- 新聞業(yè)務(wù)流程
- 《調(diào)度通信系統(tǒng)》課件
- 小學(xué)英語(yǔ)湘少版三年級(jí)起點(diǎn)《Unit 10 He has two feet.》獲獎(jiǎng)教學(xué)設(shè)計(jì)-四年級(jí)英語(yǔ)教案
- 化工企業(yè)常見(jiàn)安全隱患警示清單
- 中部車(chē)場(chǎng)設(shè)計(jì)
- CMG軟件在稠油油藏的全油藏?cái)?shù)值模擬中的應(yīng)用
- 房地產(chǎn)項(xiàng)目工程管理措施及實(shí)施細(xì)則3
- 合理歸因 課件(共22張ppt) 心理健康
- 最新高中英語(yǔ)新課程標(biāo)準(zhǔn)
- 橋梁工程涵背、臺(tái)背回填施工方案
- 99S203 消防水泵接合器安裝圖集
- 葛洪義《法理學(xué)》(人大第4版)筆記和課后習(xí)題(含考研真題)詳解
- 高一政治學(xué)情分析
評(píng)論
0/150
提交評(píng)論