Flash教程之編程基礎(chǔ)-新手也能看得懂_第1頁
Flash教程之編程基礎(chǔ)-新手也能看得懂_第2頁
Flash教程之編程基礎(chǔ)-新手也能看得懂_第3頁
Flash教程之編程基礎(chǔ)-新手也能看得懂_第4頁
Flash教程之編程基礎(chǔ)-新手也能看得懂_第5頁
已閱讀5頁,還剩20頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

Flash編程基礎(chǔ)(言簡(jiǎn)意賅適合新人沒有基礎(chǔ)也能看懂啊)教學(xué)提要ActionScript代碼的輸入與編輯語法與結(jié)構(gòu)錯(cuò)誤與調(diào)試重點(diǎn)與難點(diǎn) 重點(diǎn)是語法與結(jié)構(gòu),視課堂講授的進(jìn)度安排教學(xué)內(nèi)容。由于安排的內(nèi)容較多,若課堂上無法全部完成,則改為回去自學(xué)。教學(xué)內(nèi)容:ActionScript代碼的輸入與編輯Flash是一個(gè)集美工、動(dòng)畫與編程于一體的集成開發(fā)環(huán)境,故而其編程方式與其它純程序開發(fā)的編程方式有所不同。Flash自誕生之日起,就是以美工、動(dòng)畫為主,以程序?yàn)檩o的應(yīng)用框架。我們可以理解為,F(xiàn)lash的總體結(jié)構(gòu)就是一個(gè)影片剪輯(MovieClip),而幾乎所有的多媒體內(nèi)容都是掛在這個(gè)影片剪輯中的某個(gè)分支之上,包括腳本(代碼),形成一個(gè)樹形結(jié)構(gòu)。自ActionScript3.0起,這個(gè)框架被規(guī)范化為顯示對(duì)象層次結(jié)構(gòu)。一個(gè)典型的Flash作品的結(jié)構(gòu)如下圖所示:典型的Flash作品的結(jié)構(gòu)這種以動(dòng)畫為主,代碼為輔的程序框架的好處是顯而易見的,因?yàn)橛螒蜷_發(fā)的許多工作與畫面設(shè)計(jì)打交道,我們利用對(duì)象層次結(jié)構(gòu),在直觀的環(huán)境下創(chuàng)作幾乎整個(gè)游戲!腳本的從屬地位的好處顯而易見,而其壞處也越來越被人們認(rèn)識(shí),就是對(duì)于其他程序開發(fā)人員來說,F(xiàn)lash的腳本有些莫名其妙,要想開發(fā)Flash程序,就必須先了解Flash的顯示對(duì)象層次結(jié)構(gòu),動(dòng)畫,時(shí)間軸等原本與編程無多大聯(lián)系的知識(shí)。目前,F(xiàn)lash界面設(shè)計(jì)與代碼設(shè)計(jì)的分離成了趨勢(shì),例如通過flex等提供一個(gè)完全適合程序員的開發(fā)環(huán)境。由于游戲類型的應(yīng)用,界面與程序結(jié)合非常緊密,所以還是采用原有的框架,在單獨(dú)的Flash開發(fā)環(huán)境中完成所有的工作。雖然Actionscript代碼可以被掛在Flash中的許多分支上,但查看和編輯腳本卻十分方便,因?yàn)樗械拇a都在動(dòng)作面板(腳本編輯器)中輸入和編輯,只要用鼠標(biāo)點(diǎn)擊相應(yīng)的位置或者對(duì)象,就會(huì)顯示這個(gè)位置或?qū)ο笏杏玫拇a。打開一個(gè)Flash文檔,按F9鍵,或者點(diǎn)擊【窗口】|【動(dòng)作】命令,即可打開動(dòng)作面板。動(dòng)作面板如下圖所示:動(dòng)作面板由于接下來要經(jīng)常和動(dòng)作面板打交道,所以這里對(duì)動(dòng)作面板進(jìn)行較為詳細(xì)的介紹。腳本版本選擇:點(diǎn)擊下拉按鈕彈出ActionScript版本列表,選擇其中的一個(gè),則語言元素列表的內(nèi)容會(huì)作相應(yīng)的變化。需要注意的是這里修改的是語言元素列表的顯示內(nèi)容,但本文檔的ActionScript版本并不因此而被修改。ActionScript版本選擇語言元素列表:這是一個(gè)樹型結(jié)構(gòu)的目錄,它列出了當(dāng)前版本的語言元素、包以及索引。其中每個(gè)包里面有一個(gè)或多個(gè)類,每個(gè)類的屬性、方法和事件也都列在樹型結(jié)構(gòu)中。如下圖所示:語言元素列表雙擊其中的一個(gè)條目,就可以在代碼窗口添加一行相應(yīng)的代碼,然后用腳本助手或者直接手動(dòng)進(jìn)行必要的修改。當(dāng)前代碼位置:當(dāng)前代碼位置指出腳本編輯器中的代碼位于Flash文檔的何處。典型的代碼放置位置是主時(shí)間軸的幀上或者是影片剪輯中的幀上。如果是AS2或更早版本,代碼也可能是直接依附在影片剪輯或者按鈕上。做法是單擊一個(gè)剪輯或者按鈕,然后打開動(dòng)作面板,輸入或者編輯其上的代碼。相信有過Flash8或以前版本使用經(jīng)驗(yàn)的讀者對(duì)按鈕上的on函數(shù)再熟悉不過了。工具欄:動(dòng)作面板的工具欄給出了針對(duì)Flash代碼的各種實(shí)用的按鈕,這些按鈕的說明如下圖所示:動(dòng)作面板的工具欄及其解釋點(diǎn)擊按鈕將彈出與語言元素列表內(nèi)容一樣的菜單。點(diǎn)擊按鈕可以在編譯之前查找代碼的語法錯(cuò)誤,這些錯(cuò)誤會(huì)在輸出窗口中顯示。點(diǎn)擊可以將代碼依據(jù)其結(jié)構(gòu)自動(dòng)縮進(jìn)對(duì)齊,如果代碼存在語法錯(cuò)誤,則會(huì)提示語法錯(cuò)誤,無法套用格式。從起右邊的按鈕,是FlashCS3新增的。這些按鈕和VisualStudio.NET的相關(guān)工具類似,估計(jì)是汲取其優(yōu)點(diǎn)而添加的。腳本助手:腳本助手開啟時(shí),會(huì)在動(dòng)作面板的上部顯示當(dāng)前行代碼的結(jié)構(gòu)信息,提供詳細(xì)的輔助信息。如圖所示,點(diǎn)擊for循環(huán)語句首行時(shí)腳本助手顯示的信息:腳本助手開啟腳本助手時(shí)無法自由修改腳本代碼,而且擠占了動(dòng)作面板許多空間,所以它只適合初學(xué)者在不清楚程序結(jié)構(gòu)或者擔(dān)心引入語法錯(cuò)誤的情況下使用。當(dāng)讀者對(duì)ActionScript的語法與結(jié)構(gòu)具有一定的了解之后,應(yīng)該取消腳本助手,而在代碼窗口中自由地編輯代碼。語法與結(jié)構(gòu)本章節(jié)講解ActionScript的語法與結(jié)構(gòu),但并不按教科書的方式詳細(xì)講解。而是完全將FlashCS3看作是一種面向?qū)ο蟮木幊涕_發(fā)環(huán)境,以最簡(jiǎn)練的代碼講解ActionScript的語法與結(jié)構(gòu)。從簡(jiǎn)練的代碼中引申出來的各種編程概念和知識(shí)面,則以列表的方式平鋪。這種方法可以使大家利用以前所學(xué)的其它語言的編程知識(shí),快速過渡到ActionScript編程上來。第一段示例代碼打開FlashCS3Professional,選擇【文件】|【新建】,或者按Ctrl+N,彈出新建文檔對(duì)話框。選擇“Flash文檔(ActionScript3.0)”,按確定新建一個(gè)Flash文檔。點(diǎn)擊“圖層1”的第1幀,按【F9】彈出動(dòng)作面板,輸入以下代碼://這是我第一次寫ActionScript腳本varsum:Number;varcount:Number=5;sum=0;for(vari:Number=1;i<=count;i++){ sum=i*(i+1)/2; trace("1累加到"+i+"的值為:"+sum);}如下圖所示:第一個(gè)腳本注意:下文若提到“輸入以下代碼”時(shí),就是在新建文檔的圖層1的第1幀的動(dòng)作面板中輸入下框中的代碼。在調(diào)試程序前保存文件是一個(gè)良好的習(xí)慣,因?yàn)檎l也不能肯定剛剛編寫的腳本不會(huì)在調(diào)試過程中造成死機(jī),若調(diào)試過程中出現(xiàn)死機(jī)或者意外退出Flash程序,那么沒有保存的內(nèi)容將會(huì)丟失。按Ctrl+S保存文件,然后選擇【控制】|【測(cè)試影片】,或者按Ctrl+Enter測(cè)試影片。這時(shí)會(huì)彈出兩個(gè)窗口,一個(gè)是Flash作品的窗口,因?yàn)閯偛艣]有建立任何可見的元素,所以這個(gè)窗口是空白的。還有一個(gè)是輸出窗口,當(dāng)有trace輸出語句或者出現(xiàn)語法錯(cuò)誤的時(shí)候就會(huì)自動(dòng)彈出輸出窗口。本段程序測(cè)試時(shí)輸出窗口如下圖所示:本程序的輸出這段代碼包含以下知識(shí)點(diǎn):代碼注釋的語法變量聲明與賦值的方法數(shù)據(jù)類型與默認(rèn)值顯式類型指定及其意義程序結(jié)構(gòu)語句基本數(shù)學(xué)運(yùn)算trace語句介紹現(xiàn)在讓我們一行行地認(rèn)識(shí)這些代碼://這是我第一次寫腳本這是一行代碼注釋,編譯器將忽略這行文字。注釋提高了代碼的可讀性。單行注釋由“//”開始,在代碼中呈灰色。如果需要多行注釋,則使用“/*”開始,用“*/”結(jié)束。一個(gè)典型的多行注釋如下所示:/*********************************Boat.as**輪船類**作者:肖剛**********************************/再看本例接下來的兩行代碼:varsum:Number;varcount:Number=5;這兩行代碼聲明兩個(gè)數(shù)值類型的變量sum和count。var是聲明變量的關(guān)鍵字,sum與count是變量名稱。Number指出變量數(shù)據(jù)類型為數(shù)值。第二行代碼聲明變量count的同時(shí)賦值一個(gè)初始值5。對(duì)于面向?qū)ο蟮某绦蛟O(shè)計(jì)語言來說,所有的數(shù)據(jù)類型都是對(duì)象,都是類。Flash的內(nèi)置類可以分為兩種,一種是基元類型,也被成為原始類型,它們一般用來存儲(chǔ)一些簡(jiǎn)單的數(shù)據(jù),有的原始類型還具有一些針對(duì)所存儲(chǔ)的數(shù)據(jù)的屬性和方法。原始類型是構(gòu)建復(fù)雜類的基本元素。另一種是復(fù)雜類,它們是由class關(guān)鍵字定義的類,可以認(rèn)為是程序的構(gòu)件,一般具有成套的屬性、方法和事件。原始類型的變量直接存儲(chǔ)數(shù)據(jù),而復(fù)雜類型的變量存儲(chǔ)的是類的引用。更多的關(guān)于類與對(duì)象的介紹,請(qǐng)參看“Flash的內(nèi)置類”以及“面向?qū)ο蟪绦蛟O(shè)計(jì)”章節(jié)。下表列出了ActionScript常用的原始類型,以及其簡(jiǎn)要的說明,它們的用法都是大同小異的:數(shù)據(jù)類型說明BooleanBoolean數(shù)據(jù)類型包括兩個(gè)值:true和false。對(duì)于此類變量,其它任何值都是無效的。已經(jīng)聲明但尚未初始化的布爾變量的默認(rèn)值是false。Number此數(shù)據(jù)類型可以表示整數(shù)、無符號(hào)整數(shù)和浮點(diǎn)數(shù)。若要存儲(chǔ)浮點(diǎn)數(shù),數(shù)字中應(yīng)該包括一個(gè)小數(shù)點(diǎn)。若沒有小數(shù)點(diǎn),數(shù)字將被存儲(chǔ)為整數(shù)。int存儲(chǔ)32位有符號(hào)整形數(shù)據(jù)。使用int類型有助于利用CPU快速處理整形運(yùn)算的能力。(僅適用于ActionScript3.0)uint存儲(chǔ)32位無符號(hào)整數(shù)的數(shù)據(jù)。uint類主要用于像素顏色值(ARGB和RGBA)和int數(shù)據(jù)類型無法很好工作的其它情況。(僅適用于ActionScript3.0)StringString數(shù)據(jù)類型表示16位字符的序列,可能包括字母、數(shù)字和標(biāo)點(diǎn)符號(hào)。字符串存儲(chǔ)為Unicode字符,使用UTF-16格式。對(duì)字符串值的操作返回字符串的一個(gè)新的實(shí)例。默認(rèn)值如果沒有給變量賦值,變量將采用默認(rèn)值。變量默認(rèn)值列表如下:數(shù)據(jù)類型默認(rèn)值Booleanfalseint0NumberNaNObjectundefinedStringnulluint0未聲明(與類型注釋*等效)undefined其它所有類(包括用戶定義的類)undefined顯式類型指定:雙引號(hào)“:”是類型(type)運(yùn)算符,用于顯式指定變量的數(shù)據(jù)類型,與var關(guān)鍵字配合使用。它可以指定變量類型、函數(shù)返回類型或函數(shù)參數(shù)類型。在變量聲明或賦值中使用時(shí),此運(yùn)算符指定變量的類型;在函數(shù)聲明或定義中使用時(shí),此運(yùn)算符指定函數(shù)的返回類型;在函數(shù)定義中與函數(shù)參數(shù)一起使用時(shí),此運(yùn)算符指定該參數(shù)預(yù)期的變量類型。顯式指定數(shù)據(jù)類型不僅僅是一個(gè)良好的編程習(xí)慣,以便避免運(yùn)行時(shí)出現(xiàn)不匹配情況;同時(shí),對(duì)于Flash來說,腳本編輯器支持內(nèi)置類和基于這些類的變量的代碼提示,從而提高了編程的效率。如果需要為指定的變量的特定對(duì)象類型提供代碼提示就要嚴(yán)格指定變量類型,F(xiàn)lash根據(jù)變量的類型彈出合適的提示。代碼提示有兩種:彈出菜單提示和工具提示樣式的語法提示。彈出菜單提示如下圖所示:彈出菜單提示由于在之前顯式聲明了變量today為Date(日期)類型,所以當(dāng)用鍵盤敲入“today”然后敲入“.”時(shí),編輯器就會(huì)自動(dòng)列出Date類型的變量的所有屬性和方法供我們選擇。這大大提高了編程的效率,也減少了由于記憶或者輸入錯(cuò)誤而引起的程序錯(cuò)誤。語法提示如下圖所示:語法提示語法提示在使用內(nèi)置類的成員函數(shù)時(shí)出現(xiàn),如上圖中我們使用了內(nèi)置類Date的getFullYear函數(shù)時(shí),它會(huì)提示我們這個(gè)函數(shù)的參數(shù)為空,函數(shù)的返回值為Number類型。程序的基本結(jié)構(gòu):繼續(xù)看接下去的代碼:for(vari:Number=1;i<=count;i++){//內(nèi)部代碼略這是一個(gè)for循環(huán)結(jié)構(gòu)。它的標(biāo)準(zhǔn)格式為:for(表達(dá)式1;表達(dá)式2;表達(dá)式3){內(nèi)嵌語句}它的執(zhí)行過程如下:求解表達(dá)式1求解表達(dá)式2,若其值為真(true),則執(zhí)行內(nèi)嵌語句,若為假(false),則轉(zhuǎn)到第(5)步求解表達(dá)式3轉(zhuǎn)回上面第(2)步繼續(xù)執(zhí)行循環(huán)結(jié)束,執(zhí)行for循環(huán)以后的過程使用流程圖來表示的話,for循環(huán)結(jié)構(gòu)的執(zhí)行如下圖所示:for循環(huán)結(jié)構(gòu)雖然表達(dá)式1到表達(dá)式3可以是任意的單條語句,但是最常用的是它們分別表示循環(huán)變量賦初始值,循環(huán)條件,循環(huán)變量增值,例如本例的代碼。通常的計(jì)算機(jī)程序總是由若干條語句組成,從執(zhí)行方式上看,從第一條語句到最后一條語句完全按順序執(zhí)行,是簡(jiǎn)單的順序結(jié)構(gòu);若在程序執(zhí)行過程當(dāng)中,根據(jù)用戶的輸入或中間結(jié)果去執(zhí)行若干不同的任務(wù)則為選擇結(jié)構(gòu);如果在程序的某處,需要根據(jù)某項(xiàng)條件重復(fù)地執(zhí)行某項(xiàng)任務(wù)若干次或直到滿足或不滿足某條件為止,這就構(gòu)成循環(huán)結(jié)構(gòu)。順序結(jié)構(gòu)、循環(huán)結(jié)構(gòu)、選擇結(jié)構(gòu)構(gòu)成了結(jié)構(gòu)化程序設(shè)計(jì)的三個(gè)基本單元,而眾多的基本單元構(gòu)成龐大的程序。順序結(jié)構(gòu)的流程圖如下所示:順序結(jié)構(gòu)典型的選擇結(jié)構(gòu)的流程圖如下所示:典型選擇結(jié)構(gòu)按順序編寫的語句即為順序結(jié)構(gòu),所以沒有結(jié)構(gòu)語句,而循環(huán)結(jié)構(gòu)和選擇結(jié)構(gòu)分別有多種語句結(jié)構(gòu),這些結(jié)構(gòu)如下表所示:結(jié)構(gòu)類型語句以及語法說明循環(huán)結(jié)構(gòu)for(初始值;條件;增值){語句}先賦初始值,然后判斷條件,為真的情況下執(zhí)行語句,然后增值,完成一次循環(huán),接著重新判斷條件,直到條件為假。for(變量in對(duì)象){語句}順序遍歷對(duì)象的屬性或數(shù)組中的元素,并對(duì)每個(gè)屬性或元素執(zhí)行語句。while(條件){語句}當(dāng)條件為真時(shí)執(zhí)行語句,然后判斷條件,如果為真,執(zhí)行語句,重新判斷條件,直到條件為假。do{語句}while(條件);先執(zhí)行語句,然后判斷條件,如果為真,繼續(xù)執(zhí)行語句。選擇結(jié)構(gòu)if(條件){語句}判斷條件,如果為真,則執(zhí)行語句。if(條件){語句1}else{語句2}判斷條件,如果為真,執(zhí)行語句1,否則,執(zhí)行語句2。if(條件1){語句1}elseif(條件2){語句2}判斷條件1,如果為真,則執(zhí)行語句1,否則如果條件2為真,則執(zhí)行語句2。switch(變量){case值1:語句1……case值n:語句n[default:語句]}多分支選擇結(jié)構(gòu)。比較變量的值,如果為值1,則執(zhí)行語句1以及以后的語句,如果為值n,則執(zhí)行語句n以及以后的語句。如果只想執(zhí)行某一分支的語句n,則在語句n的最后應(yīng)加break;語句。注:如果讀者沒有結(jié)構(gòu)化程序設(shè)計(jì)的基礎(chǔ),可以參考Flash的腳本幫助,打開Flash程序,選擇【幫助】|【Flash幫助】或者按F1就可以打開Flash的幫助面板??梢栽谀夸浿袑ふ一蛘咧苯铀阉鱽碚业揭獙W(xué)習(xí)的內(nèi)容。任何軟件,它的幫助文件就是最好的教材?;蛘咦x者也可以找任何一本編程基礎(chǔ)的書籍,翻看之后即會(huì)明白。 更多的語句、關(guān)鍵字和指令,可以參考Flash的幫助文件,其位置如下圖所示:算術(shù)運(yùn)算:再看本例接下來的一行代碼:sum=i*(i+1)/2;這行代碼的作用是將1~i的整數(shù)數(shù)字累加的結(jié)果放在sum變量中。它使用了多個(gè)算術(shù)運(yùn)算符以及賦值運(yùn)算符“=”。事實(shí)上,可以將這上行代碼用一個(gè)for循環(huán)來表達(dá)。sum=0;for(varj:Number=1;j<=i;j++){sum=sum+j;}但這明顯增加了代碼的復(fù)雜度。使用累加的公式:則代碼變簡(jiǎn)單,執(zhí)行效率當(dāng)然就提高了。游戲中常常需要使得運(yùn)動(dòng)滿足各種物理運(yùn)動(dòng)規(guī)律,這些規(guī)律都有公式可循,附錄中給出了一些常用的數(shù)學(xué)與物理現(xiàn)象公式以供參考。下表是ActionScript的算術(shù)運(yùn)算符:運(yùn)算符說明=賦值運(yùn)算符?:條件運(yùn)算符+相加-相減*相乘/相除%取余++自加1--自減1()小括號(hào)和代數(shù)運(yùn)算一樣,程序中的運(yùn)算符也具有優(yōu)先級(jí),程序總是先執(zhí)行優(yōu)先級(jí)最高的運(yùn)算。上表中,運(yùn)算符的優(yōu)先級(jí)正好從低到高排列(有相同優(yōu)先級(jí)的,如加法“+”和減法“-”的優(yōu)先級(jí)是一樣的。事實(shí)上,程序中的算計(jì)運(yùn)算的優(yōu)先級(jí)和中小學(xué)算術(shù)運(yùn)算的優(yōu)先級(jí)是一致的,所以非常好理解。跟蹤調(diào)試函數(shù)trace:再看本例接下來的一行代碼:trace("1累加到"+i+"的值為:"+sum);trace是一個(gè)跟蹤調(diào)試的函數(shù),它可以在輸出窗口中一字符串的方式輸出trace函數(shù)的參數(shù),每條trace語句輸出一行字符串。trace語句可以有一個(gè)或者多個(gè)參數(shù),參數(shù)的類型可以是任意的,事實(shí)上,它將條用參數(shù)對(duì)象的toString方法,輸出對(duì)象的字符串表示方式。本例中使用了字符串連接符“+”將多個(gè)字符串連接成一個(gè)字符串作為trace函數(shù)的參數(shù)。運(yùn)算符“+”的兩邊都是數(shù)字的時(shí)候表示加法運(yùn)算,但是如果兩邊有一個(gè)是字符串,則表示字符串連接運(yùn)算。trace語句是調(diào)試程序的好幫手。它可以輸出一些運(yùn)行時(shí)的信息以便檢測(cè)程序執(zhí)行和發(fā)現(xiàn)程序錯(cuò)誤。trace語句在發(fā)布的swf文件中不起作用,不會(huì)對(duì)最后結(jié)果造成影響。如果想在調(diào)試過程中暫時(shí)不輸出trace的結(jié)果,那么在【文件】|【發(fā)布設(shè)置】的Flash頁中勾選“省略trace動(dòng)作”即可。如下圖所示:trace輸出開關(guān)在接下來的例子中,我們還將多次使用到trace語句,用來查看程序執(zhí)行的中間結(jié)果以及最后結(jié)果。包括在游戲?qū)嵗a中也可能保留著trace語句,那是調(diào)試游戲時(shí)留下的,對(duì)最終的程序沒有影響,也不必刪除。第二段示例代碼程序說明:建立一個(gè)4×6的二維數(shù)組,每個(gè)數(shù)組元素保存一個(gè)0~10的隨機(jī)整數(shù),然后輸出這個(gè)數(shù)組。新建Flash文檔,輸入以下代碼://定義一維數(shù)組varmyArray:Array=newArray(4);for(vari=0;i<4;i++){ //一維數(shù)組的每個(gè)元素為一個(gè)新的一維數(shù)組 myArray[i]=newArray(6); for(varj=0;j<6;j++){ //給數(shù)組元素賦隨機(jī)值 myArray[i][j]=int(Math.random()*10); } //輸出一維數(shù)組myArray[i] trace(myArray[i]);}按Ctrl+Enter測(cè)試影片,則輸出這個(gè)二維數(shù)組的值。某次的輸出如下:3,8,7,4,0,40,6,0,1,1,86,0,6,7,5,01,9,8,5,6,4這段代碼包含以下的知識(shí)點(diǎn):數(shù)組對(duì)象以及多維數(shù)組的使用嵌套循環(huán)內(nèi)建數(shù)學(xué)類Math的使用數(shù)據(jù)類型轉(zhuǎn)換編譯器的嚴(yán)謹(jǐn)模式與非嚴(yán)謹(jǐn)模式現(xiàn)在來解釋這些代碼,先看第一行代碼:varmyArray:Array=newArray(4);這里聲明了一個(gè)Array類型的變量myArray,并用new關(guān)鍵字創(chuàng)建這個(gè)Array對(duì)象的實(shí)例,初始化其長度為4。Array是一個(gè)用來表示一維數(shù)組的數(shù)據(jù)類型,它可以存儲(chǔ)任意類型的數(shù)據(jù)或?qū)ο?。?shù)組是游戲程序中頻繁使用到的一種數(shù)據(jù)類型。用變量名稱引用數(shù)組對(duì)象,訪問數(shù)組的每個(gè)元素則使用下標(biāo)運(yùn)算符“[]”,下標(biāo)從0開始編號(hào)。假設(shè)數(shù)組元素存儲(chǔ)的是另一個(gè)數(shù)組,那么就構(gòu)成了二維數(shù)組,以此類推。多維數(shù)組的的訪問采用多個(gè)下標(biāo)運(yùn)算符即可。Array是一個(gè)復(fù)雜對(duì)象,必須用new關(guān)鍵字創(chuàng)建它的實(shí)例,否則聲明的變量無法訪問,因?yàn)锳ctionScript要通過new關(guān)鍵字給復(fù)雜對(duì)象在內(nèi)存中開辟一個(gè)空間,存儲(chǔ)這個(gè)對(duì)象之用。也可以創(chuàng)建一個(gè)空的數(shù)組對(duì)象,或者創(chuàng)建數(shù)組對(duì)象的同時(shí)給數(shù)組賦值。如下代碼所示://創(chuàng)建一個(gè)空的數(shù)組varmyArray1:Array=newArray();//創(chuàng)建一個(gè)有三個(gè)元素的數(shù)組,元素值分別為1,2,3varmyArray2:Array=newArray(1,2,3);數(shù)組對(duì)象不僅僅為我們提供了存儲(chǔ)數(shù)組的數(shù)據(jù)結(jié)構(gòu),同時(shí)還提供了一些基于數(shù)組的屬性和操作函數(shù)等,例如數(shù)組的長度、給數(shù)組元素排序等等。這里不一一舉例說明,而僅以列表的方式給出數(shù)組對(duì)象Array常用的成員:成員說明length屬性,表示數(shù)組中元素?cái)?shù)量的非負(fù)整數(shù)。Array(numElements:int=0)允許創(chuàng)建指定元素?cái)?shù)量的數(shù)組,默認(rèn)為0。Array(...values)允許創(chuàng)建包含指定元素的數(shù)組。concat(...args):Array將參數(shù)中指定的元素(組)附加到數(shù)組中,形成新的數(shù)組。forEach(callback:Function,thisObject:*=null):void對(duì)數(shù)組中的每一項(xiàng)執(zhí)行函數(shù)。pop():Object刪除數(shù)組中最后一個(gè)元素,并返回該元素的值。push(...args):uint將一個(gè)或多個(gè)元素添加到數(shù)組的結(jié)尾,并返回該數(shù)組的新長度。reverse():Array倒轉(zhuǎn)數(shù)組的順序。shift():Object刪除數(shù)組中第一個(gè)元素,并返回該元素。slice(startIndex:int=0,endIndex:int=16777215):Array返回由原始數(shù)組中某一范圍的元素構(gòu)成的新數(shù)組,而不修改原始數(shù)組。some(callback:Function,thisObject:*=null):Boolean對(duì)數(shù)組中的每一項(xiàng)執(zhí)行測(cè)試函數(shù),直到獲得返回true的項(xiàng)。sort(...args):Array對(duì)數(shù)組中的元素進(jìn)行排序。splice(startIndex:int,deleteCount:uint,...values):Array給數(shù)組添加元素以及從數(shù)組中刪除元素。unshift(...args):uint將一個(gè)或多個(gè)元素添加到數(shù)組的開頭,并返回該數(shù)組的新長度。類成員的使用方法為:變量名.成員名如果成員為一函數(shù),則需要加括號(hào)“()”,如果函數(shù)有參數(shù),則放在括號(hào)里面,多個(gè)參數(shù)用逗號(hào)“,”隔開。Array對(duì)象不僅有以上這些成員,還有一些被稱為靜態(tài)常數(shù)的成員。所謂的靜態(tài)成員,是指使用類名引用而不是類實(shí)例名引用的成員。靜態(tài)成員一般用于輔助此類相關(guān)的一些操作。例如Array.NUMERIC就是一個(gè)Array類的靜態(tài)屬性(也稱為常數(shù)),在對(duì)數(shù)進(jìn)行排序的時(shí)候用來表示按數(shù)值大小的順序排序而不是字符串編碼的順序排序。提示:本書中有許多的知識(shí)列表,為了節(jié)約篇幅,這些列表一般都是經(jīng)過精簡(jiǎn),剔除了游戲程序中不用或者很少使用到的項(xiàng)。讀者若想了解這些被精簡(jiǎn)的項(xiàng),可以參考Flash幫助文件。嵌套循環(huán):再看看接下來的一段代碼:for(vari=0;i<4;i++){ //一維數(shù)組的每個(gè)元素為一個(gè)新的一維數(shù)組 myArray[i]=newArray(6); for(varj=0;j<6;j++){ //給數(shù)組元素賦隨機(jī)值 myArray[i][j]=int(Math.random()*9); }}這段代碼的結(jié)構(gòu)為嵌套的循環(huán)結(jié)構(gòu)。第一層循環(huán)給myArray數(shù)組的每一個(gè)元素賦值一個(gè)新的數(shù)組,第二層循環(huán)為myArray數(shù)組的每個(gè)元素所表示的數(shù)組的每個(gè)元素賦隨機(jī)的初始值。這段代碼用流程圖表示如下:嵌套循環(huán)上圖中,內(nèi)部循環(huán)結(jié)構(gòu)可以看作是一個(gè)簡(jiǎn)單的表達(dá)式,它與其前一條語句組成順序結(jié)構(gòu),而這個(gè)順序結(jié)構(gòu)又可以看作是一個(gè)簡(jiǎn)單的表達(dá)式,而成為外部循環(huán)結(jié)構(gòu)的內(nèi)嵌表達(dá)式。一個(gè)完整的程序,是有著大量的順序結(jié)構(gòu)、選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)嵌套、組合的的復(fù)合體。熟練使用結(jié)構(gòu)化程序設(shè)計(jì)思想是編寫復(fù)雜程序的基礎(chǔ)。Math類:這段代碼還用到了Flash內(nèi)建的數(shù)學(xué)類Math的一個(gè)靜態(tài)方法:random(),它的作用是生成一個(gè)0~1之間的隨機(jī)小數(shù)。Math是Flash內(nèi)嵌的數(shù)學(xué)計(jì)算輔助類,開發(fā)游戲經(jīng)常要和這個(gè)類打交道。它是一個(gè)靜態(tài)類,包含一些靜態(tài)函數(shù)和靜態(tài)屬性,以提供常用的數(shù)學(xué)方法和數(shù)學(xué)常數(shù),在程序的任何地方都可以調(diào)用這些成員。例如表示圓周率π的常數(shù)為Math.PI。下面這行代碼計(jì)算面積為area的圓的半徑:r=Math.sqrt(area/Math.PI);下表列出了Math對(duì)象的部分常數(shù)。常數(shù)說明E代表自然對(duì)數(shù)的底的數(shù)學(xué)常數(shù),表示為e。LN10代表10的自然對(duì)數(shù)的數(shù)學(xué)常數(shù),其近似值為2.302585092994046。LN2代表2的自然對(duì)數(shù)的數(shù)學(xué)常數(shù),其近似值為0.6931471805599453。PI代表一個(gè)圓的周長與其直徑的比值的數(shù)學(xué)常數(shù),其近似值為3.141592653589793。SQRT1_2代表1/2的平方根的數(shù)學(xué)常數(shù),其近似值為0.7071067811865476。SQRT2代表2的平方根的數(shù)學(xué)常數(shù),其近似值為1.4142135623730951。Math還包含了一些數(shù)學(xué)函數(shù)。在游戲編程中將常常用到這些方法。下表列出了Math對(duì)象的部分?jǐn)?shù)學(xué)函數(shù):函數(shù)說明abs(x)返回由參數(shù)x指定的數(shù)字的絕對(duì)值。acos(x)返回由參數(shù)x指定的數(shù)字的反余弦值。asin(x)返回由參數(shù)x指定的數(shù)字的反正弦值。atan(tangent)返回角度值,該角度的正切值已由參數(shù)tangent指定。cos(x)返回指定角度的余弦值。exp(x)返回自然對(duì)數(shù)的底的x次冪的值。log(x)返回參數(shù)x的自然對(duì)數(shù)。pow(x,y)計(jì)算并返回x的y次冪。random()返回一個(gè)偽隨機(jī)數(shù)n,其中0<=n<1。round(x)將參數(shù)x的值向上或向下舍入為最接近的整數(shù)并返回該值。sin(x)以弧度為單位計(jì)算并返回指定角度的正弦值。sqrt(x)計(jì)算并返回指定數(shù)字的平方根。tan(x)計(jì)算并返回指定角度的正切值。注:上表中的所有三角函數(shù)和反三角函數(shù)都是以弧度制為單位。Math完整的常數(shù)和方法請(qǐng)參看腳本提示,或者查看Flash的幫助文件。類型轉(zhuǎn)換這段代碼中,在給二維數(shù)組的每個(gè)元素賦值以前,先將隨機(jī)數(shù)進(jìn)行了強(qiáng)制類型轉(zhuǎn)換:int(),它的作用是將隨機(jī)生成的小數(shù)轉(zhuǎn)換成整數(shù)。將某種類型的數(shù)據(jù)(對(duì)象)轉(zhuǎn)換為其它類型的數(shù)據(jù)(對(duì)象)時(shí),就說發(fā)生了類型轉(zhuǎn)換。類型轉(zhuǎn)換有兩種:一種是隱式轉(zhuǎn)換,另一種是顯式轉(zhuǎn)換。隱式轉(zhuǎn)換又稱為強(qiáng)制轉(zhuǎn)換,是代碼中沒有指示卻實(shí)際上進(jìn)行了的類型轉(zhuǎn)換,在運(yùn)行時(shí)由FlashPlayer執(zhí)行。隱式轉(zhuǎn)換發(fā)生在以下情況中:在賦值語句中在將值作為函數(shù)的參數(shù)傳遞時(shí)在從函數(shù)中返回值時(shí)在使用某些運(yùn)算符(如加法運(yùn)算符(+))的表達(dá)式中顯式轉(zhuǎn)換由代碼指示編譯器將一個(gè)數(shù)據(jù)類型的變量視為屬于另一個(gè)數(shù)據(jù)類型時(shí)發(fā)生。語法為:目標(biāo)類型(被轉(zhuǎn)換對(duì)象)例如:varquantityField:String="3";varquantity:int=int(quantityField);//顯式轉(zhuǎn)換不管是顯式轉(zhuǎn)換還是隱式轉(zhuǎn)換,其內(nèi)部的算法都是一樣的。類型轉(zhuǎn)換之后,可能會(huì)發(fā)生值的改變。例如Number類型轉(zhuǎn)換成int類型,則會(huì)將小數(shù)點(diǎn)后面的數(shù)值截?cái)啵瑢?shù)值類型轉(zhuǎn)換成Boolean類型時(shí),非0值轉(zhuǎn)換成true,而0轉(zhuǎn)換成false。如果轉(zhuǎn)換的目標(biāo)類型是復(fù)雜類,則被轉(zhuǎn)換對(duì)象應(yīng)該是相關(guān)類型,相關(guān)類型指具有繼承關(guān)系的類型。所有的復(fù)雜類都繼承自O(shè)bject類,所以所有復(fù)雜類都可以轉(zhuǎn)換為Object類。MovieClip類繼承自Sprite類,所以MovieClip類可以轉(zhuǎn)換成Sprite類,但是Sprite類不能轉(zhuǎn)換成MovieClip類,因?yàn)镸ovieClip類不是Sprite類的相關(guān)類型。Date類與MovieClip類之間互不繼承,所以它們之間不能相互轉(zhuǎn)換。在類型轉(zhuǎn)換中如果出現(xiàn)類型不匹配,則會(huì)出現(xiàn)錯(cuò)誤。如果編譯器為嚴(yán)謹(jǐn)模式,則在編譯的時(shí)候就會(huì)彈出編譯錯(cuò)誤,程序無法編譯完成,但是如果是標(biāo)準(zhǔn)模式,則會(huì)在程序運(yùn)行到類型匹配錯(cuò)誤的時(shí)候才彈出錯(cuò)誤。當(dāng)程序比較龐大時(shí),越早發(fā)現(xiàn)錯(cuò)誤越好,所以程序員都傾向于使用嚴(yán)謹(jǐn)模式。修改嚴(yán)謹(jǐn)模式的方法為:選擇【文件】|【發(fā)布設(shè)置】,然后選擇“Flash”標(biāo)簽,在ActionScript版本下來框中選擇“ActionScript3.0”,然后點(diǎn)擊旁邊的“設(shè)置”按鈕,彈出“ActionScript3.0設(shè)置”嚴(yán)謹(jǐn)模式設(shè)置勾選“嚴(yán)謹(jǐn)模式”即可。新建的AS3文檔默認(rèn)使用嚴(yán)謹(jǐn)模式,但AS2無嚴(yán)謹(jǐn)模式的概念,如果您使用的是由AS2文檔轉(zhuǎn)換過來的AS3文檔,則默認(rèn)使用非嚴(yán)謹(jǐn)模式。另外,嚴(yán)謹(jǐn)模式還要求變量都要先聲明才能使用,如果在發(fā)布設(shè)置中取消了嚴(yán)謹(jǐn)模式,則Flash可以不顯式聲明變量(即不使用var關(guān)鍵字聲明變量)。如varcount:Number=5;可以寫成count=5;兩者的效果是一樣的,F(xiàn)lash在第一次使用這個(gè)變量的時(shí)候自動(dòng)定義這個(gè)變量,并且根據(jù)所賦的值的類型確定變量的數(shù)據(jù)類型。但有經(jīng)驗(yàn)的程序員都明白,先聲明后使用的嚴(yán)謹(jǐn)編程習(xí)慣,對(duì)減少編程錯(cuò)誤、維護(hù)復(fù)雜程序等方面是非常有意義的做法,目前絕大多數(shù)編程語言都逐漸摒棄了非嚴(yán)謹(jǐn)模式,AS3因向下兼容的需要而保留了這個(gè)選項(xiàng)。第三段示例代碼程序說明:尋找一個(gè)1000以內(nèi)的,能被7整除并且二進(jìn)制數(shù)的第四位是0第五位是1的數(shù)字。新建Flash文檔,輸入以下代碼:vartestNumber;varcount=0;do{ count++; //隨機(jī)產(chǎn)生一個(gè)1~1000之間的整數(shù) testNumber=Math.round(Math.random()*1000);}while(!correctNumber(testNumber));trace("找到一個(gè)能被7整除并且二進(jìn)制數(shù)的第四位是0第五位是1的數(shù)字:\r"+testNumber);trace("總共循環(huán)了\""+count+"\"次");functioncorrectNumber(para1:Number):Boolean{ if(para1%7==0&&(para1>>3)%4==2){ returntrue; }else{ returnfalse; }}按Ctrl+Enter測(cè)試影片。會(huì)得到如下的輸出結(jié)果:找到一個(gè)能被7整除并且二進(jìn)制數(shù)的第四位是0第五位是1的數(shù)字:693總共循環(huán)了"5"次代碼說明:這段代碼的執(zhí)行過程是先隨機(jī)生成一個(gè)1~1000的整數(shù),然后判斷它是否滿足給出的條件,如果不是,那么重新生成一個(gè)隨機(jī)數(shù),重新判斷,直到找到一個(gè)滿足條件的數(shù)字,最后輸出這個(gè)數(shù)字以及循環(huán)的次數(shù)。這段代碼包含以下知識(shí)點(diǎn):自定義函數(shù)邏輯運(yùn)算符復(fù)合邏輯關(guān)系關(guān)系運(yùn)算符位運(yùn)算符轉(zhuǎn)義字符現(xiàn)在來解釋一下其中的一些關(guān)鍵代碼:testNumber=Math.round(Math.random()*1000);這里再次使用了Math對(duì)象的兩個(gè)方法,用來產(chǎn)生一個(gè)1000以內(nèi)的隨機(jī)整數(shù)。回到示例代碼,看看下面這行代碼:while(!correctNumber(testNumber));這是dowhile循環(huán)結(jié)構(gòu)中的條件部分。它調(diào)用了一個(gè)自定義函數(shù)correctNumber(),它有一個(gè)數(shù)值類型的參數(shù),當(dāng)參數(shù)不是目標(biāo)數(shù)值,則函數(shù)返回值為false時(shí),由于進(jìn)行了非運(yùn)算(!),條件變成true,程序進(jìn)入下一次循環(huán),即繼續(xù)執(zhí)行do語句后面的代碼,直到當(dāng)參數(shù)就是目標(biāo)數(shù)值,函數(shù)返回值為true,進(jìn)行非運(yùn)算之后變成false,不滿足循環(huán)條件,才跳出循環(huán)。自定義函數(shù):函數(shù)correctNumber()實(shí)現(xiàn)了是否是所要數(shù)字的判斷,是這段程序的重要組成部分。使用函數(shù)可以提高代碼的可讀性和可維護(hù)性,一般在如下情況下使用函數(shù):代碼的輸入和輸出比較簡(jiǎn)單而中間過程比較復(fù)雜。使用函數(shù)使得在直觀上把實(shí)現(xiàn)的細(xì)節(jié)隱藏,提高了代碼的可讀性。在多個(gè)地方都要使用到相同的代碼,或者只有參數(shù)不同的代碼。就是說這段代碼是為了完成某個(gè)常用的任務(wù)。例如在一個(gè)拼圖游戲里面,點(diǎn)擊任意一個(gè)方塊都會(huì)執(zhí)行相應(yīng)的移動(dòng)(或者不移動(dòng))方塊的操作。初學(xué)者往往習(xí)慣于把相關(guān)程序放在每個(gè)方塊對(duì)象上。這造成代碼的大量冗余,可維護(hù)性差。而聰明的方法是將相應(yīng)的操作寫成一個(gè)函數(shù),然后通過對(duì)象的事件處理函數(shù)調(diào)用這個(gè)函數(shù),并將被點(diǎn)擊對(duì)象的標(biāo)識(shí)符(自定義)屬性作為這個(gè)函數(shù)的參數(shù)。某一大段代碼是為了完成某個(gè)單一的任務(wù)。這同樣是為了提到代碼的可讀性。經(jīng)驗(yàn)表明,每個(gè)程序塊在30自然行以內(nèi)比較方便維護(hù)。也就是說,如果你有段代碼超過30行,那么應(yīng)該考慮是否要使用函數(shù)切分這個(gè)程序塊了。說了這么多,現(xiàn)在來看看如何實(shí)現(xiàn)自定義函數(shù)吧!自定義函數(shù)的語法如下:function函數(shù)名(參數(shù)列表)[:返回類型]{函數(shù)內(nèi)部代碼[return返回值]}注:方括號(hào)表示其為語法結(jié)構(gòu)中的可選項(xiàng)。自定義函數(shù)的另一種語法是:函數(shù)名=function(參數(shù)列表)[:返回類型]{函數(shù)內(nèi)部代碼[return返回值]}函數(shù)可以沒有參數(shù),也可以有多個(gè)參數(shù),多個(gè)參數(shù)用逗號(hào)隔開。返回類型指定這個(gè)函數(shù)返回的是什么類型的數(shù)據(jù),由函數(shù)內(nèi)部代碼中的return語句返回。如果函數(shù)沒有返回值,則返回類型為void。一個(gè)有趣的現(xiàn)象是在AS2中,函數(shù)可以嵌套定義。也就是說,可以將一個(gè)函數(shù)定義在另一個(gè)函數(shù)之中。這樣,就可以通過函數(shù)來組織一個(gè)數(shù)據(jù)+操作的結(jié)構(gòu)。這樣的函數(shù)結(jié)構(gòu)與類(Class)已經(jīng)很接近了。再繼續(xù)看這行代碼:if(para1%7==0&&(para1>>3)%4==2){邏輯運(yùn)算符:&&是一個(gè)邏輯運(yùn)算符。表示邏輯關(guān)系“與”,只有&&兩邊的表達(dá)式都為true,結(jié)果才為true。ActionScript提供三種邏輯運(yùn)算符:運(yùn)算符執(zhí)行的運(yùn)算&&(AND)邏輯"與"||(OR)邏輯"或"?。∟OT)邏輯"非"復(fù)合邏輯關(guān)系:這是一個(gè)if條件結(jié)構(gòu)的一部分,括號(hào)內(nèi)部是一個(gè)Boolean類型值。它可以由多個(gè)邏輯值通過邏輯運(yùn)算符組合而成,這個(gè)組合就是復(fù)合邏輯表達(dá)式,復(fù)合的結(jié)果要么是true,要么是false。下表是最簡(jiǎn)的復(fù)合判斷表:運(yùn)算符結(jié)果A&&B(與)若A、B皆為true則返回true,否則返回falseA||B(或)只要A、B中有一個(gè)為true,就返回true,否則返回false!A(非)若A為true,返回false,若A為false,返回true關(guān)系運(yùn)算符:testNumber%7==0是一個(gè)關(guān)系判斷語句,先把testNumber對(duì)7求余數(shù),然后比較“==”號(hào)兩邊的數(shù)值,如果==號(hào)兩邊的值相等,則結(jié)果為true,否則結(jié)果為false?!?=”號(hào)是一個(gè)關(guān)系運(yùn)算符。和其它編程語言一樣,ActionScript提供豐富的關(guān)系運(yùn)算符。它們都有兩個(gè)操作數(shù),比較兩個(gè)操作數(shù)的值,然后依據(jù)比較的規(guī)則返回一個(gè)布爾值。ActionScript中的關(guān)系運(yùn)算符列表如下:運(yùn)算符執(zhí)行的運(yùn)算<小于>大于<=小于或等于>=大于或等于==等于===如果兩者相等并且數(shù)據(jù)類型也相同時(shí)成立!===如果兩者不相等并且數(shù)據(jù)類型也不相同時(shí)成了instanceof如果運(yùn)算符左邊的變量原型是右邊所示的類時(shí)成立此表中的所有運(yùn)算符都具有相同的優(yōu)先級(jí)并且高于所有的邏輯運(yùn)算符。位運(yùn)算符:這段代碼中有一個(gè)位運(yùn)算符“>>”,它的作用是直接將數(shù)值的二進(jìn)制數(shù)按位向右移動(dòng)3位,被移出的部分自動(dòng)剔除而空缺的位自動(dòng)補(bǔ)0。例如假設(shè)para1=173,省略高位的0,則其二進(jìn)制表示為:10101101。右移3位之后則變成10101,十進(jìn)制的數(shù)值為:21。Flash提供豐富的位操作符。使用位操作的優(yōu)點(diǎn)是它提供了一種新的運(yùn)算方式,而且由于它直接操作二進(jìn)制數(shù),提高了計(jì)算的速度。常用位運(yùn)算表如下:運(yùn)算符執(zhí)行的運(yùn)算&按位"與"|按位"或"<<左移>>右移^按位異或轉(zhuǎn)義字符:再看本例接下來的代碼:trace("找到一個(gè)能被7整除并且二進(jìn)制數(shù)的第四位是0第五位是1的數(shù)字:\r"+testNumber);trace("總共循環(huán)了\""+count+"\"次");這兩條trace語句與先前不同的是使用了轉(zhuǎn)義字符。轉(zhuǎn)義字符指那些不能直接在字符串中表示出來的字符,因?yàn)檫@些字符被引作它用。例如雙引號(hào)“””,在程序中用來表示字符串的開始或者結(jié)束。如果某字符串本身含有雙引號(hào),則必須使用轉(zhuǎn)義字符。轉(zhuǎn)義字符以反斜杠“\”標(biāo)識(shí),反斜杠的轉(zhuǎn)義字符為兩個(gè)反斜杠“\\”。下表是一些常用的轉(zhuǎn)義字符。轉(zhuǎn)義序列說明\b退格符。\f換頁符。\n換行符。\r回車。\t制表符。\unnnn任意的Unicode字符,字符代碼由十六進(jìn)制數(shù)字nnnn指定。例如,\u263a是一個(gè)微笑字符。\xnn任意的ASCII字符,字符代碼由十六進(jìn)制數(shù)字nn指定。\'單引號(hào)。\"雙引號(hào)。\\單反斜杠字符。自此我們已經(jīng)用三個(gè)簡(jiǎn)短的代碼將ActionScript腳本語言的語法結(jié)構(gòu),以及數(shù)組的使用,內(nèi)置類的使用進(jìn)行的大致的講解。由于本書的定位不是講解ActionScript的用法,而是用ActionScript開發(fā)游戲,所以僅對(duì)這些基礎(chǔ)知識(shí)點(diǎn)到為止。錯(cuò)誤與調(diào)試程序錯(cuò)誤有三種,一種是語法錯(cuò)誤,編譯時(shí)提示編譯錯(cuò)誤并列出發(fā)現(xiàn)錯(cuò)誤所在位置。一種是運(yùn)行時(shí)錯(cuò)誤,編譯通過了,但是在程序運(yùn)行的時(shí)候出現(xiàn)了錯(cuò)誤。還有一種是邏輯錯(cuò)誤,就是程序不會(huì)拋出任何錯(cuò)誤,但是無法得到“應(yīng)有”的結(jié)果。語法錯(cuò)誤與處理所有的語法錯(cuò)誤都在點(diǎn)擊語法檢查或者按Ctrl+Enter編譯時(shí)在輸出窗口中報(bào)錯(cuò),只有沒有語法錯(cuò)誤的代碼才能通過編譯器編譯。先看看語法錯(cuò)誤的例子,新建Flash文檔,輸入以下代碼:vartoday:Date=newDate();trace("今天是:");trace(today.getFullYear()+"年+(today.getMonth()+1)+"月"+today.getDate()+"日");按Ctrrl+Enter測(cè)試影片,會(huì)看到輸出窗口輸出兩個(gè)編譯錯(cuò)誤:語法錯(cuò)誤雙擊其中的一條錯(cuò)誤,即可跳轉(zhuǎn)到發(fā)現(xiàn)錯(cuò)誤所在的代碼行。錯(cuò)誤描述則給出了關(guān)于錯(cuò)誤的詳細(xì)說明,根據(jù)錯(cuò)誤描述可以比較容易就找到錯(cuò)誤的原因所在。需要注意的是,錯(cuò)誤提示給出的錯(cuò)誤位置和錯(cuò)誤描述并不一定準(zhǔn)確無誤。因?yàn)榫幾g器只有按語法規(guī)則在代碼發(fā)現(xiàn)語法錯(cuò)誤的時(shí)候才報(bào)錯(cuò),但此時(shí)可能已經(jīng)過了實(shí)際錯(cuò)誤所在,或者是由其它錯(cuò)誤連帶引起的語法錯(cuò)誤。如上面的例子,實(shí)際錯(cuò)誤是在“年”字后面少了一個(gè)雙引號(hào)“””。但是程序執(zhí)行到這個(gè)位置的時(shí)候并不會(huì)發(fā)現(xiàn)錯(cuò)誤,因?yàn)榫幾g器把“年+(today.getMonth()+1)+”看成是一個(gè)字符串,直到“月”字才發(fā)現(xiàn)語法錯(cuò)誤。編譯器認(rèn)為“月”是一個(gè)變量,而它與前面的字符串之間缺少了連接符。同時(shí)編譯器還發(fā)現(xiàn)了連帶引起的語法錯(cuò)誤:在該語句結(jié)尾字符串沒有結(jié)束。事實(shí)上并不一定要在編譯的時(shí)候才能檢測(cè)語法錯(cuò)誤。一種簡(jiǎn)單的方法是看代碼的顏色。ActionScript代碼帶有某些色彩,以便區(qū)分各種類型的標(biāo)識(shí)符。默認(rèn)情況下,關(guān)鍵字是藍(lán)色,字符串是綠色,注釋是灰色,函數(shù)與變量是黑色。如果發(fā)現(xiàn)非預(yù)期的顏色,就可以確認(rèn)代碼中存在語法錯(cuò)誤。例如本例的代碼在動(dòng)作面板中的顏色為:代碼的顏色還有一個(gè)方法是點(diǎn)擊動(dòng)作面板上的語法檢查按鈕。如果有錯(cuò)誤,則會(huì)彈出輸出窗口并顯示當(dāng)前代碼的所有語法錯(cuò)誤。提示編譯器錯(cuò)誤避免運(yùn)行時(shí)錯(cuò)誤與邏輯錯(cuò)誤排除運(yùn)行時(shí)錯(cuò)誤和邏輯錯(cuò)誤是一件費(fèi)時(shí)費(fèi)力的工作。Flash游戲尤其如此,由于FlashPlayer往往以嵌入在其它軟件中的形式存在,為了不把錯(cuò)誤傳遞給它的“載體”,F(xiàn)lashPlayer將幾乎所有的錯(cuò)誤都“藏”了起來,甚至在調(diào)試時(shí)也不提示錯(cuò)誤。隱藏錯(cuò)誤增強(qiáng)了程序執(zhí)行時(shí)的穩(wěn)定性,但卻給開發(fā)人員排除錯(cuò)誤留下不少的困難。所幸的是3.0已經(jīng)采取了積極的措施,引入了成套的錯(cuò)誤處理機(jī)制,大大降低了除錯(cuò)的難度。在講解如何除錯(cuò)之前,應(yīng)該首先考慮如何減少錯(cuò)誤。養(yǎng)成良好的編程習(xí)慣是必要的。以下是一些建議:采用一致的命名規(guī)則附錄中給出了ActionScript程序員共同遵循的一組命名規(guī)則,讀者最好也遵循這樣的命名規(guī)則。多添加注釋如果沒有注釋,即使是自己寫的程序,時(shí)間久了閱讀起來也存在困難。修改起來就更加麻煩,更加容易引入錯(cuò)誤。應(yīng)用軟件工程的思想,做到高內(nèi)聚低耦合高內(nèi)聚低耦合是軟件設(shè)計(jì)的一個(gè)基本原則,說的是在程序的各個(gè)模塊中,盡量讓每個(gè)模塊獨(dú)立,同時(shí)相關(guān)的處理盡量在單個(gè)模塊中完成。這樣能提降低各模塊的之間的聯(lián)系,減少“牽一發(fā)而動(dòng)全身”的幾率,提高開發(fā)效率,降低升級(jí)維護(hù)成本,也便于進(jìn)行單元測(cè)試,提高軟件質(zhì)量。即使小到一個(gè)函數(shù),也應(yīng)該遵照這個(gè)原則。在程序中采用合適的錯(cuò)誤處理機(jī)制雖然沒有錯(cuò)誤處理機(jī)制程序一般能順利運(yùn)行,但程序不會(huì)總是按理想的方式運(yùn)行。例如加載外部文件,如果文件不存在了,自然程序就會(huì)不正常。網(wǎng)絡(luò)通信、用戶操作、文件讀寫、條件不足、設(shè)備忙是常見的出錯(cuò)地方,在這些地方添加錯(cuò)誤捕捉機(jī)制可以捕獲這些錯(cuò)誤,然后作相應(yīng)的處理。采用了錯(cuò)誤處理機(jī)制的程序能夠適應(yīng)更加“惡劣”的使用環(huán)境,使得程序更加健壯。ActionScript2.0可以使用Error類,使用try-catch-finally機(jī)制捕捉錯(cuò)誤,或者重載錯(cuò)誤事件。Error類是遵循ECMAScript規(guī)范的核心類,ActionScript3.0中仍然可以使用,也可以使用偵聽器捕獲錯(cuò)誤事件,關(guān)于偵聽器的使用請(qǐng)參看相關(guān)的章節(jié)。同時(shí)它還采用flash.errors類包中的類捕捉更確切的錯(cuò)誤。提示:在錯(cuò)誤處理方面,ActionScript3.0比ActionScript2.0有了比較大的改進(jìn)。它提供了更加貼切的語法錯(cuò)誤消息、更多的警告、拋出更多的錯(cuò)誤以及擴(kuò)展的捕獲錯(cuò)誤的體系結(jié)構(gòu)。調(diào)試時(shí),3.0出現(xiàn)錯(cuò)誤后就停止執(zhí)行代碼,而2.0卻會(huì)在錯(cuò)誤情況下繼續(xù)執(zhí)行。try-catch-finally機(jī)制舉例:新建文檔(AS3),輸入以下代碼://僅適用于ActionScript3.0及以上版本importflash.errors.IOError;importflash.media.Sound;varmusic:Sound=newSound();try{ music.close(); trace("聲音停止了");}catch(error:IOError){ trace("聲音流關(guān)閉出現(xiàn)錯(cuò)誤:\r"+error.toString()); trace("更多的錯(cuò)誤處理代碼");}finally{ trace("不管是否捕捉到錯(cuò)誤,這段代碼都被執(zhí)行"); //一般在此處做釋放內(nèi)存操作}首先用import語句導(dǎo)入FlashPlayer的兩個(gè)API,然后創(chuàng)建一個(gè)API對(duì)象Sound的實(shí)例music,接著嘗試關(guān)閉music。由于music實(shí)例還加載聲音流,所以使用close方法的時(shí)候出錯(cuò),F(xiàn)lash拋出IOError,被try-catch結(jié)構(gòu)捕獲,程序跳入catch部分進(jìn)行一些處理。按Ctrl+Enter測(cè)試影片,得到如下的輸出:聲音流關(guān)閉出現(xiàn)錯(cuò)誤:Error:Error#2029:此URLStream對(duì)象中沒有已打開的流。更多的錯(cuò)誤處理代碼不管是否捕捉到錯(cuò)誤,這段代碼都被執(zhí)行從結(jié)果中可以看出,當(dāng)music實(shí)例close的時(shí)候觸發(fā)錯(cuò)誤,程序跳轉(zhuǎn)到捕獲錯(cuò)誤的位置,所以“trace("聲音停止了");”這行代碼沒有被執(zhí)行。提示:一個(gè)try語句可以帶多個(gè)catch語句,以便捕獲到不同的錯(cuò)誤,作不同的處理。finally語句是可選的。初學(xué)者易犯的編程錯(cuò)誤把邏輯運(yùn)算符“==”錯(cuò)寫成賦值運(yùn)算符“=”大小寫錯(cuò)誤對(duì)象路徑?jīng)]有正確指定Flash的總體框架是一個(gè)樹型結(jié)構(gòu),而代碼又分散在這個(gè)結(jié)構(gòu)的各個(gè)分支。如果沒有指定正確的路徑,當(dāng)然無法得到正確的結(jié)果。有兩種方法指定路徑:相對(duì)路徑和絕對(duì)路徑。類名與類實(shí)例名混淆我們得分清楚類名和類實(shí)例名的區(qū)別。類是面向?qū)ο笳Z言構(gòu)建軟件的基本構(gòu)件,而實(shí)例,則是類在程序中的副本??梢岳斫鉃轭愂菍?shí)例的模板,而實(shí)例是類的表現(xiàn)形式。一個(gè)類可以有多個(gè)實(shí)例,而一個(gè)實(shí)例只能屬于一個(gè)類。庫中的元件和場(chǎng)景中的剪輯就是類與類實(shí)例的典型代表。在程序中,只能通過類實(shí)例名來引用某個(gè)具體的實(shí)例,而不是類名。例如庫中有一個(gè)名為“boy”的元件,將其拖到場(chǎng)景中(即創(chuàng)建這個(gè)類的實(shí)例),在屬性欄中設(shè)置實(shí)例名稱為“boy1”。那么控制這個(gè)剪輯停止播放的代碼應(yīng)為:boy1.stop();混淆數(shù)字“+”運(yùn)算與字符串“+”運(yùn)算數(shù)字“+”運(yùn)算返回兩個(gè)數(shù)字相加的結(jié)果,而字符串“+”運(yùn)算返回兩個(gè)字符串連接在一起的字符串。當(dāng)“+”號(hào)兩邊都是數(shù)字的時(shí)候,按數(shù)字加法運(yùn)算,當(dāng)“+”號(hào)兩邊有一邊是字符串的時(shí)候,按字符串連接處理。但是問題的關(guān)鍵是如果沒有強(qiáng)行指定數(shù)據(jù)的類型,那么ActionScript有可能將數(shù)字類型當(dāng)字符串處理,從而出錯(cuò)。例如程序中有三個(gè)文本框,txt1,txt2,txtResult,和三個(gè)變量num1,num2和sum。我們希望用戶輸入在txt1中txt2輸入數(shù)字后點(diǎn)擊“計(jì)算”按鈕,將兩個(gè)數(shù)相加的結(jié)果存儲(chǔ)在sum中并顯示。我們很自然地想到用下面的表達(dá)式:num1=txt1.text;num2=txt2.text;sum=num1+num2;txtResult.text=sum;但是相加的結(jié)果卻令人吃驚。假如5和7,那么計(jì)算的結(jié)果顯示為12,這還算正常,但是當(dāng)一個(gè)文本框輸入3e-2(科學(xué)計(jì)數(shù)法,表示0.03)另一個(gè)輸入3時(shí),計(jì)算的結(jié)果顯示為“3e-23”!為什么會(huì)出現(xiàn)這種結(jié)果呢?因?yàn)锳ctionScript將這兩個(gè)變量當(dāng)作字符串相加了!所以,在參與“+”例如上面數(shù)字相加的代碼,應(yīng)該改寫成:sum=Number(num1)+Number(num2);某些字符識(shí)別錯(cuò)誤有些字符看上去非常像,例如字母l、g、o與數(shù)字1、9、0;把中文輸入法的全角標(biāo)號(hào)當(dāng)作英文的半角標(biāo)號(hào)而出錯(cuò),如“(”、“)”、“,”、“;”,被寫成了“(”、“)”、“,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論