2023年Flash編程基礎言簡意賅適合新人沒有基礎也能看懂啊_第1頁
2023年Flash編程基礎言簡意賅適合新人沒有基礎也能看懂啊_第2頁
2023年Flash編程基礎言簡意賅適合新人沒有基礎也能看懂啊_第3頁
2023年Flash編程基礎言簡意賅適合新人沒有基礎也能看懂啊_第4頁
2023年Flash編程基礎言簡意賅適合新人沒有基礎也能看懂啊_第5頁
已閱讀5頁,還剩31頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論