包含12節(jié)視頻教程
關(guān)注15.8萬(wàn)次
卡通女孩作品是由漂亮的女老師制作的。具有女性作者特有的技術(shù)優(yōu)點(diǎn),看看你能否掌握這些細(xì)膩的操作和淺顯易懂的技術(shù)流程。這個(gè)教程是個(gè)完整的maya角色制作流程!
第1章 揭開(kāi)actionscript的神秘面紗
actionscript是flash內(nèi)置的編程語(yǔ)言,用它為動(dòng)畫(huà)編程,可以實(shí)現(xiàn)各種動(dòng)畫(huà)特效、對(duì)影片的良好控制、強(qiáng)大的人機(jī)交互以及與網(wǎng)絡(luò)服務(wù)器的交互功能。
actionscript是一門(mén)吸收了c++、java以及javascript等編程語(yǔ)言部分特點(diǎn)的新的語(yǔ)言。actionscrip使用英文單詞和元件提供了一種為flash影片設(shè)置指令的方法。它的存在確保了flash影片較之普通的按照線性模式播放的動(dòng)畫(huà)具備強(qiáng)大得多的人機(jī)交互能力。
可以為時(shí)間軸中的關(guān)鍵幀、按鈕和影片剪輯添加actionscript。選中這些關(guān)鍵幀、按鈕和影片剪輯,打開(kāi)其動(dòng)作面板,你就可以看到它們都添加了哪些腳本。
1.1 flash中的程序
交給計(jì)算機(jī)執(zhí)行的指令集稱為程序。程序的另一個(gè)名稱叫做腳本。從現(xiàn)在開(kāi)始,我們將這些指令集統(tǒng)稱為腳本。
腳本都必須有它的運(yùn)行環(huán)境,就actionscript來(lái)說(shuō),它的運(yùn)行環(huán)境就是flash影片。actionscript可以指揮flash影片該做什么。在某些情況下,actionscript還可以指揮其他的東西,如用戶的操作系統(tǒng)、瀏覽器等。但是actionscript最主要的用途還在于控制flash影片內(nèi)部的東西。
短的腳本可以只有一行,長(zhǎng)的腳本可以長(zhǎng)達(dá)幾千行。它們可以作用于flash影片的一個(gè)部分,也可以貫穿影片始終。有人把使用了腳本的整個(gè)flash影片看作一個(gè)程序,也有人把影片中單獨(dú)出現(xiàn)的腳本看作一個(gè)程序。這兩種看法都正確,因?yàn)橐粋(gè)單獨(dú)的程序也可以被定義成若干小程序。
你可能對(duì)某些編程語(yǔ)言已經(jīng)相當(dāng)熟悉或者有所了解。例如廣大網(wǎng)頁(yè)設(shè)計(jì)者所熟知的javascript,以及另一種相似的語(yǔ)言vbscript,它們能用來(lái)編輯動(dòng)態(tài)網(wǎng)頁(yè)。html(hypertext markup language 超文本置標(biāo)語(yǔ)言)是另一種特殊的語(yǔ)言,瀏覽器將按照它所包括的指令正確地顯示文本和圖片。
在學(xué)校里面,你可能接觸過(guò)一些編程方面的課程,如basic、pascal、c、java等。
除html以外,以上提到的所有的語(yǔ)言都包含很相似的程序結(jié)構(gòu):循環(huán)、條件、變量等等。只要你知道了actionscript的特殊用法,你就可以將以前所學(xué)的編程知識(shí)利用起來(lái)。就算你以前從來(lái)沒(méi)有接觸過(guò)編程方面的知識(shí),不用擔(dān)心,我會(huì)將所有需要的知識(shí)都告訴你。
1.2 actionscript是從哪里來(lái)的
actionscript是從哪里來(lái)的呢?事實(shí)上它的確是從好幾種程序語(yǔ)言中深化而來(lái)的。下面我們先花一點(diǎn)時(shí)間了解一下計(jì)算機(jī)語(yǔ)言的起源和發(fā)展。
當(dāng)?shù)谝慌_(tái)數(shù)字計(jì)算機(jī)誕生的時(shí)候,唯一的編程語(yǔ)言是計(jì)算機(jī)的專用語(yǔ)言——二進(jìn)制代碼,即由數(shù)字1和0組成的編碼。當(dāng)由1和0組成的不同序列被輸入到計(jì)算機(jī)中,計(jì)算機(jī)就會(huì)執(zhí)行完全不同的操作。使用這種語(yǔ)言編寫(xiě)程序是相當(dāng)費(fèi)勁的,就算寫(xiě)一個(gè)簡(jiǎn)單的兩數(shù)相加的程序,程序的長(zhǎng)度也是相當(dāng)驚人的。
為了避免每次都為兩數(shù)相加的操作書(shū)寫(xiě)長(zhǎng)長(zhǎng)的二進(jìn)制程序,有人書(shū)寫(xiě)了一種專門(mén)用于兩數(shù)相加的代碼,你可以方便地使用相同的代碼實(shí)現(xiàn)任意兩數(shù)的相加操作。接著,一些類似的函數(shù)誕生了,用它們可以處理所有的基本任務(wù),如加、減、乘、除、比較、循環(huán)等等。從此以后,你可以使用這些事先編寫(xiě)好的函數(shù)執(zhí)行幾乎所有的操作了。
現(xiàn)代的計(jì)算機(jī)語(yǔ)言理解和使用起來(lái)較之二進(jìn)制編碼都已經(jīng)容易了無(wú)數(shù)倍,其一,現(xiàn)代計(jì)算機(jī)語(yǔ)言與英語(yǔ)語(yǔ)法很相似,如“go”、“for”、“begin”、“if”以及+、-、=等,它們的含義和用法與現(xiàn)實(shí)中都相差不大。
basic、pascal等編程語(yǔ)言,幾乎可以像英語(yǔ)句子一樣閱讀,所以學(xué)習(xí)和理解起來(lái)都非常容易。其他語(yǔ)言,如c、fortran,它們的功能更強(qiáng)一些,經(jīng)驗(yàn)豐富的程序員可以用它們完成更復(fù)雜的任務(wù)。更多的語(yǔ)言居于以上兩種語(yǔ)言之間,如c++、java和javascript,它們既有一定的可讀性,也有較強(qiáng)的功能。actionscript與這些語(yǔ)言有更多的相似之處。
flash遵從ecma(european computer manufacturers association歐洲計(jì)算機(jī)工業(yè)協(xié)會(huì))制定的標(biāo)準(zhǔn),因此actionscript與ecmascript(ecma開(kāi)發(fā)的一種語(yǔ)言)極其相似。所以與其說(shuō)actionscript建立在javascript的基礎(chǔ)上,不如說(shuō)actionscript和javascript都建立在.
1.4 actionscript放在哪里
初學(xué)actionscript的flash愛(ài)好者最想問(wèn)的問(wèn)題恐怕是“actionscript應(yīng)該放在哪里?”
flash是一種復(fù)雜的多媒體編輯環(huán)境,如果你曾經(jīng)使用過(guò)flash,或者看過(guò)flash mx附帶的教程,你就應(yīng)該知道flash中的一些基本術(shù)語(yǔ)或元素。在flash的元素中有3個(gè)地方可以放置腳本。
1.4.1 時(shí)間軸
flash影片中的每個(gè)場(chǎng)景都有時(shí)間軸,時(shí)間軸上的每個(gè)關(guān)鍵幀都可以放置腳本。并且,你還可以在每一個(gè)關(guān)鍵幀的不同層上放置不同的腳本。
在主時(shí)間軸中放置腳本之前,需要先選擇一個(gè)關(guān)鍵幀。啟動(dòng)flash時(shí),時(shí)間軸中有一個(gè)空白關(guān)鍵幀,如圖1-1顯示了默認(rèn)的空白關(guān)鍵幀和選中它時(shí)的狀態(tài)。
當(dāng)選中一個(gè)關(guān)鍵幀后,你就可以打開(kāi)動(dòng)作面板,查看里面的腳本或者開(kāi)始編寫(xiě)你自己的腳本了。
有幾種方法可以打開(kāi)動(dòng)作面板。你可以選擇“窗口”→“動(dòng)作”命令,或者按快捷鍵f9。
如果你對(duì)flash復(fù)雜的影片瀏覽器比較熟悉,你也可以在影片瀏覽器中查看整個(gè)flash影片所用到的腳本。打開(kāi)影片瀏覽器的快捷鍵是alt+f3。
如圖1-2所示即為flash mx的動(dòng)作面板。該動(dòng)作面板被命令為“動(dòng)作-幀”,這是因?yàn)槠渲械哪_本將作用在幀上。如果是新建的一個(gè)影片,動(dòng)作面板將是空的。后面我們將在動(dòng)作面板中添加各種各樣的腳本。第2章我們將看到如何使用動(dòng)作面板。
時(shí)間軸中的腳本將在flash影片播放到腳本所在的關(guān)鍵幀位置時(shí)自動(dòng)執(zhí)行。例如,如果你為某一關(guān)鍵幀添加了stop()命令,當(dāng)影片播放到那一幀位置時(shí)就會(huì)自動(dòng)停止。要讓影片繼續(xù)播放,只有在其他的腳本中添加相應(yīng)的命令。
在時(shí)間軸中添加腳本還有一個(gè)好處就是方便你在actionscript中使用函數(shù)。函數(shù)是可以重復(fù)使用的腳本代碼,要想使整個(gè)影片都可以調(diào)用腳本中的函數(shù),就必須將函數(shù)放置在主時(shí)間軸中。
1.4.2 按鈕
flash中的元素又稱作元件(symbol)。元件主要有3種:圖形(graphic)、影片剪輯(movie clip)和按鈕(button)。圖形元件不能承載腳本,它們只能是簡(jiǎn)單的靜態(tài)或動(dòng)態(tài)圖像。影片剪輯與圖形元件類似,但是它可以承載腳本。
第3種元件就是按鈕,按鈕可以承載腳本。事實(shí)上,如果沒(méi)有腳本,按鈕幾乎不會(huì)發(fā)揮什么作用。
要為按鈕添加腳本,首先要在舞臺(tái)中選中按鈕,然后選擇“窗口”→“動(dòng)作”命令或按快捷鍵f9打開(kāi)動(dòng)作面板。
與幀動(dòng)作面板相對(duì)應(yīng),選中按鈕時(shí)動(dòng)作面板的標(biāo)題是“動(dòng)作-按鈕”。
你可能會(huì)認(rèn)為,為按鈕添加的腳本應(yīng)該是在單擊按鈕時(shí)執(zhí)行。其實(shí),也可以為其他鼠標(biāo)動(dòng)作添加相應(yīng)的腳本,如鼠標(biāo)進(jìn)入和移出按鈕區(qū)域。按鈕也可以響應(yīng)按鍵動(dòng)作,這使得我們可以方便地為按鈕設(shè)置快捷鍵。
1.4.3 影片剪輯
影片剪輯不同于圖形元件,可以為影片剪輯命名,為影片剪輯添加腳本。為影片剪輯添加腳本的方法與按鈕類似。
為影片剪輯添加的腳本可以用來(lái)控制影片剪輯自身或控制時(shí)間軸中的其他影片剪輯。使用腳本可以判斷影片剪輯出現(xiàn)在屏幕中的什么位置,你也可以用腳本來(lái)控制影片剪輯的重復(fù)播放等,進(jìn)而控制整個(gè)動(dòng)畫(huà)。
除了可以為影片剪輯添加腳本,你也可以在影片剪輯內(nèi)部添加腳本。影片剪輯其實(shí)也是一個(gè)單獨(dú)的flash影片,在影片剪輯中有一條單獨(dú)的時(shí)間軸,你可以像在主時(shí)間軸中添加腳本一樣在影片剪輯內(nèi)部的時(shí)間軸中添加幀動(dòng)作腳本。同樣地,你也可以將按鈕放置到影片剪輯內(nèi)部并為按鈕添加腳本。也就是說(shuō)主時(shí)間軸中的影片剪輯里面有子影片剪輯,子影片剪輯里面又有按鈕,按鈕中也可以有影片剪輯,如果需要,你都可以為它們添加腳本。
1.5 練習(xí):你的第一段actionscript
下面來(lái)編寫(xiě)你的第一段actionscript,讓你對(duì)actionscript有更深的了解。操作步驟如下:
。1)創(chuàng)建一個(gè)新的flash文檔。
。2)選中時(shí)間軸中的第1幀,按f7鍵兩次插入兩個(gè)空白關(guān)鍵幀,這時(shí)時(shí)間軸中應(yīng)有3個(gè)空白關(guān)鍵幀。
。3)在每一幀中繪制不同的圖形。
。4)選擇“控制”→“測(cè)試影片”命令或按ctrl+enter鍵測(cè)試影片,你會(huì)看到影片在這3個(gè)幀之間循環(huán)播放。
。5)回到主時(shí)間軸,選中第2個(gè)關(guān)鍵幀,按f9鍵打開(kāi)動(dòng)作面板。
(6)動(dòng)作面板左邊顯示了可擴(kuò)展的actionscript關(guān)鍵字目錄。在“動(dòng)作”/“影片控制”目錄下面找到關(guān)鍵字stop并雙擊,腳本窗口將添加如下所示的一行語(yǔ)句:
stop();
。7)關(guān)閉動(dòng)作面板,按ctrl+enter鍵測(cè)試影片,播放第1、2幀后影片會(huì)停止,你將看不到第3幀。
actionscript發(fā)揮了作用,它成功地阻止了影片無(wú)休止地循環(huán)播放這3幀。
第2章 flash mx的動(dòng)作面板
動(dòng)作面板是flash mx面板系統(tǒng)的一部分,actionscript程序員經(jīng)常會(huì)用到它。為了成長(zhǎng)為一名嫻熟的flash編程高手,你有必要對(duì)flash的動(dòng)作面板和在線幫助系統(tǒng)相當(dāng)?shù)氖煜ぁ?/P>
動(dòng)作面板的標(biāo)準(zhǔn)模式允許你從腳本目錄中選擇關(guān)鍵字并設(shè)置相應(yīng)的選項(xiàng),而專家模式為程序員提供了直接輸入代碼的自由。
2.1 了解動(dòng)作面板
flash mx的面板系統(tǒng)向你提供了查看和設(shè)置flash中各種元素信息和屬性的捷徑。第一次啟動(dòng)flash mx的時(shí)候,系統(tǒng)將會(huì)詢問(wèn)你要使用flash做哪些方面的工作,然后為你設(shè)置默認(rèn)的面板界面。你可以選擇“窗口”→“面板設(shè)置”命令在不同的面板界面之間切換。與此同時(shí),也決定了動(dòng)作面板的大小,但是你可以將它改變成任何適合你需要的大小。
你可以通過(guò)鍵盤(pán)上的f9鍵隨意顯示或隱藏動(dòng)作面板。顯示動(dòng)作面板后,你可以單擊它的標(biāo)題欄將它展開(kāi)或折疊起來(lái)。你還可以拖動(dòng)動(dòng)作面板的左上角將它從flash的工作界面中分離出來(lái)。
動(dòng)作面板有兩種不同的工作模式。默認(rèn)的模式是標(biāo)準(zhǔn)模式。在標(biāo)準(zhǔn)模式下,你必須從窗口左邊的菜單中選擇需要的關(guān)鍵字,而不能直接使用鍵盤(pán)輸入腳本,因此可以有效避免即使是很細(xì)小的錯(cuò)誤。
2.2 動(dòng)作面板的標(biāo)準(zhǔn)模式
如圖2-1所示為標(biāo)準(zhǔn)模式下的動(dòng)作面板。
面板上部的下拉菜單顯示了你當(dāng)前所編輯的腳本的準(zhǔn)確位置。圖2-1中顯示的是“幀動(dòng)作腳本1 圖層名稱 圖層1”,也就是說(shuō)當(dāng)前所編輯的腳本是作用于圖層1的第1幀的。
面板左邊顯示了actionscript命令的分類目錄,單擊展開(kāi)一個(gè)目錄,你將看到它里面的子目錄或命令。
面板的右邊是一個(gè)空白文本區(qū),它將顯示你所選擇的命令和函數(shù)。圖2-2顯示了你從左邊的目錄里面選擇插入“動(dòng)作”→“影片控制”中的goto命令后的動(dòng)作面板。goto命令是通過(guò)雙擊鼠標(biāo)添加到腳本中的。
面板右上部顯示了goto命令的簡(jiǎn)單定義,下面顯示了與goto命令相關(guān)的各種選項(xiàng),包括“場(chǎng)景”、“類型”和“幀”等,就像是所選命令的參數(shù)設(shè)置區(qū)。參數(shù)設(shè)置區(qū)的狀態(tài)會(huì)依據(jù)所選擇actionscript命令的不同而發(fā)生變化。
第一個(gè)需要設(shè)置的選項(xiàng)是選擇gotoandplay命令還是選擇gotoandstop命令。圖2-2中選中的是“轉(zhuǎn)到并播放”單選項(xiàng),也就是gotoandplay。這兩種命令是相似的,都是跳轉(zhuǎn)到特定的幀,但是gotoandplay命令使影片從特定幀開(kāi)始播放,gotoandstop命令使影片在特定幀上停止。
這個(gè)命令還需要附加一些信息才能正常工作。如,你想要使影片跳轉(zhuǎn)到哪一幀,這一幀位于哪個(gè)場(chǎng)景,圖2-2指定的是當(dāng)前場(chǎng)景。在“類型”下拉菜單中可以選擇指定特定幀的方式,你可以使用幀號(hào)、幀標(biāo)簽和表達(dá)式中的一種。圖2-2選中的是幀號(hào)類型,這就要求你精確地指定幀的編號(hào),如1。
在以上內(nèi)容的下面顯示了 和 兩個(gè)按鈕。它們使你可以快速地在腳本中插入和刪除命令。但是這種方法很少使用,你可以通過(guò)左邊的分類目錄添加腳本,使用鍵盤(pán)上的delete或back space鍵刪除不需要的命令。
和 按鈕的右邊還有幾個(gè)功能不一的按鈕。 按鈕使你可以從腳本中查找文本, 按鈕使你可以替換文本,使用 按鈕可以插入目標(biāo)路徑, 按鈕可以為你調(diào)試腳本設(shè)置斷點(diǎn), 和 按鈕使你可以選擇腳本的前一行或后一行。
在動(dòng)作面板的底部你可以看到這樣的一行:“第1行:gotoandplay(1);”,這是動(dòng)作面板的狀態(tài)行,它顯示了當(dāng)前選中的行號(hào)和該行的內(nèi)容。
2.3 分類目錄
動(dòng)作面板左邊的目錄將actionscript的關(guān)鍵字有組織地分成幾組,以使你更容易查找到需要的關(guān)鍵字的位置。以后我們會(huì)對(duì)每個(gè)組中的命令和符號(hào)作詳細(xì)的講解,下面先對(duì)其進(jìn)行一下簡(jiǎn)要的介紹。
= 動(dòng)作
在動(dòng)作類中包含了最簡(jiǎn)單的actionscript命令。動(dòng)作類提供了測(cè)試條件、循環(huán)、創(chuàng)建函數(shù)、復(fù)制和創(chuàng)建影片剪輯以及從服務(wù)器中獲取數(shù)據(jù)等功能的命令。動(dòng)作類中的命令是actionscript最重要的組成部分。動(dòng)作類又分為影片控制、瀏覽器/網(wǎng)絡(luò)、影片剪輯控制、變量、條件/循環(huán)、打印、用戶定義的函數(shù)以及其他動(dòng)作等子類。
= 運(yùn)算符
它包括了各種數(shù)學(xué)和比較運(yùn)算符,如+號(hào),用于兩數(shù)相加;==號(hào),用于判斷兩數(shù)是否相等。運(yùn)算符類下面又分為按位、比較、賦值、邏輯、算術(shù)和其他運(yùn)算符等子類。
= 函數(shù)
使用函數(shù)可以轉(zhuǎn)換數(shù)據(jù)或獲取需要的信息,如獲取flash的版本信息。你可以使用函數(shù)將字符串123轉(zhuǎn)換成數(shù)字123。你還可以自定義需要重復(fù)使用的函數(shù)。在函數(shù)類下面主要有兩個(gè)子類:數(shù)學(xué)函數(shù)和轉(zhuǎn)換函數(shù)。
= 常量
常量類中包含了一些具有特定值的特殊關(guān)鍵字,如true、false、null和newline等。
= 屬性
屬性類中的關(guān)鍵字反映了flash中元素的相關(guān)信息。例如_x屬性代表影片剪輯在屏幕中的水平位置。
= 對(duì)象
對(duì)象類是最復(fù)雜的一類,它包含了actionscript中的眾多概念。所有的對(duì)象關(guān)鍵字被分成4個(gè)子類:核心、影片、客戶端/服務(wù)器、創(chuàng)作。影片剪輯是影片類下面的一種,它包含了與控制影片剪輯相關(guān)的關(guān)鍵字。math是核心下面的一種,它包含了求平方根、正弦值等數(shù)學(xué)函數(shù)。
= 否決的
這一類中的關(guān)鍵字是已經(jīng)作廢但flash mx仍然支持的,在flash mx中請(qǐng)盡量避免使用,因?yàn)樵谝院蟮膄lash版本中將不再支持這些關(guān)鍵字。
= flash ui組件
這一類中的關(guān)鍵字包含了特殊功能的組件,如單選按鈕、滾動(dòng)條等。
= 索引
索引類將actionscript中的所有關(guān)鍵字按字母順序排列。以上各類中的關(guān)鍵字都可以在索引類中找到。
動(dòng)作面板中提供的關(guān)鍵字分類有時(shí)可以幫你方便地找到需要的關(guān)鍵字,但也有可能給你帶來(lái)麻煩。如你可能認(rèn)為表示影片剪輯水平坐標(biāo)屬性的_x應(yīng)該在對(duì)象類的“影片”/“影片剪輯”/“屬性”里面,但它卻在屬性類里面。你可能認(rèn)為sqrt(開(kāi)平方)應(yīng)該在函數(shù)類中,但它卻在“對(duì)象”/“核心”/“math”/“方法”下面。
2.4 使用flash的幫助系統(tǒng)
最好的程序員往往也要查閱一下工具書(shū),flash中的幫助系統(tǒng)就是一本功能強(qiáng)大的工具書(shū),所以在學(xué)習(xí)更多內(nèi)容之前,先了解一下flash的幫助系統(tǒng),將對(duì)我們的學(xué)習(xí)不無(wú)陴益。
flash使用工具提示和基于擴(kuò)展html的幫助系統(tǒng)。為了對(duì)actionscript的使用更加?jì)故欤憔托枰廊绾问褂盟鼈儭?/P>
2.4.1 簡(jiǎn)單定義
如果你習(xí)慣使用動(dòng)作面板中的關(guān)鍵字分類目錄,你應(yīng)該會(huì)注意到當(dāng)你在左邊的目錄中選中某個(gè)關(guān)鍵字時(shí),面板右邊的上面部分會(huì)給出與所選關(guān)鍵字相應(yīng)的簡(jiǎn)單定義。你會(huì)看見(jiàn)這樣的句子:“要添加某項(xiàng),可雙擊該項(xiàng)或?qū)⑵渫蟿?dòng)到腳本窗口。
例如選中g(shù)oto命令時(shí),你會(huì)看到這樣的提示:“轉(zhuǎn)到影片的指定幀。”它顯示了該腳本的基本功能。
單擊別的命令查看一下它們的定義,在學(xué)習(xí)下面的知識(shí)之前,你可以花些時(shí)間多看一下動(dòng)作面板中的命令。
2.4.2 腳本參考面板
flash使用腳本參考面板幫助你記住actionscript的語(yǔ)法?梢赃x擇“窗口”→“腳本參考”命令或按快捷鍵shift+f1打開(kāi)腳本參考面板。腳本參考面板如圖2-3所示。
腳本參考面板的左邊與動(dòng)作面板左邊的腳本目錄很相似。你也可以通過(guò)動(dòng)作面板進(jìn)入腳本參考面板,單擊動(dòng)作面板中的 按鈕可以打開(kāi)腳本參考面板,打開(kāi)的腳本參考面板會(huì)自動(dòng)顯示你在動(dòng)作面板中選中的命令。
2.4.3 html幫助文檔
如果要獲得actionscript命令更詳細(xì)的說(shuō)明,可以選擇“幫助”→“動(dòng)作腳本詞典”命令,這將啟動(dòng)你的瀏覽器并打開(kāi)如圖2-4所示的頁(yè)面。
圖2-4 動(dòng)作腳本詞典
瀏覽器窗口的左邊是所有actionscript命令和函數(shù)的總目錄,在左邊的條目上單擊,窗口的右邊部分會(huì)顯示其詳細(xì)的內(nèi)容。
選中每個(gè)條目時(shí),右邊窗口中通常會(huì)包括與該條目的說(shuō)明以及它的使用范例。
在你以后使用flash的時(shí)候可能經(jīng)常會(huì)用到幫助文檔,所以請(qǐng)花一些時(shí)間了解它吧。
2.5 動(dòng)作面板的專家模式
現(xiàn)在你已經(jīng)了解了動(dòng)作面板的標(biāo)準(zhǔn)模式,下面要向你推薦多數(shù)actionscript程序員使用的專家模式。
在專家模式下,你可以直接通過(guò)鍵盤(pán)輸入腳本,而不需要從左邊的目錄中選擇命令。這種模式下你可以在動(dòng)作面板中輸入任何東西,但也很容易導(dǎo)致錯(cuò)誤。
在專家模式下,你仍然可以從左邊的目錄中選擇并插入標(biāo)準(zhǔn)的actionscript命令、函數(shù)和運(yùn)算符。當(dāng)你記不確切一條命令的時(shí)候就可以使用這種方法。
2.5.1 切換模式
要從標(biāo)準(zhǔn)模式切換到專家模式,可以單擊動(dòng)作面板中的 按鈕,或者單擊動(dòng)作面板右上角的 按鈕,在打開(kāi)的下拉菜單中選擇“專家模式”命令。在動(dòng)作面板獲得焦點(diǎn)的情況下,快捷鍵ctrl+shift+n可以切換到標(biāo)準(zhǔn)模式,快捷鍵ctrl+shift+e可以切換到專家模式。
如圖2-5所示為專家模式下的動(dòng)作面板。在專家模式下,參數(shù)設(shè)置區(qū)、命令提示信息都沒(méi)有了,腳本編輯窗口占據(jù)了動(dòng)作面板右邊的大部分。
圖2-5 專家模式下的動(dòng)作面板
從標(biāo)準(zhǔn)模式切換到專家模式是非常容易的,但是要從專家模式切換到標(biāo)準(zhǔn)模式則要求腳本中沒(méi)有語(yǔ)法錯(cuò)誤。比如說(shuō)你不明白如何設(shè)置一些命令的參數(shù),需要從專家模式切換到標(biāo)準(zhǔn)模式以使用標(biāo)準(zhǔn)模式下的提示,但是flash卻不允許你進(jìn)行切換,提示你“此腳本中有語(yǔ)法錯(cuò)誤,必須在‘專家模式’下編輯它”;而當(dāng)你知道如何設(shè)置參數(shù)并將腳本書(shū)寫(xiě)正確了,又不再需要切換到標(biāo)準(zhǔn)模式了。
2.5.2 動(dòng)作面板的下拉菜單
動(dòng)作面板的下拉菜單中有一些特別是在專家模式下編輯腳本時(shí)很有用的命令。
你可以使用查找和替換命令在代碼中執(zhí)行查找和替換操作。按快捷鍵ctrl+f可以打開(kāi)“查看”對(duì)話框,按快捷鍵ctrl+h可以打開(kāi)“替換”對(duì)話框。
“轉(zhuǎn)到行…”命令可以快速轉(zhuǎn)到并選中指定的行。
“語(yǔ)法檢查”命令或按鈕 可以對(duì)窗口中的腳本進(jìn)行語(yǔ)法檢查,如果沒(méi)有語(yǔ)法錯(cuò)誤,將提示你“此腳本中沒(méi)有錯(cuò)誤!
通常,語(yǔ)法檢查只能檢查出代碼中的明顯語(yǔ)法錯(cuò)誤,它并不能檢查腳本是否能正確運(yùn)行。經(jīng)常會(huì)發(fā)生這樣的事情,就是每一行的代碼都是正確的,但所有的代碼加在一起卻導(dǎo)致了錯(cuò)誤。
語(yǔ)法檢查功能很實(shí)用,特別是對(duì)初學(xué)者來(lái)說(shuō),它能方便地檢查出誤用運(yùn)算符或缺失括號(hào)等情況。
“自動(dòng)套用格式”命令可以按預(yù)先設(shè)置的樣式和縮進(jìn)等設(shè)置腳本的格式。你可以選擇“自動(dòng)套用格式選項(xiàng)”命令,在“自動(dòng)格式選項(xiàng)”對(duì)話框中重新設(shè)置要應(yīng)用的格式,如圖2-6所示。
圖2-6 “自動(dòng)格式選項(xiàng)”對(duì)話框
另外,選擇“首選項(xiàng)…”命令可以設(shè)置動(dòng)作面板中腳本代碼的顏色、制表符寬度、字體等。你也可以在flash mx的菜單欄中選擇“編輯”→“首選參數(shù)”命令,在打開(kāi)的“首選參數(shù)”對(duì)話框中選中“動(dòng)作腳本編輯器”選項(xiàng)卡,打開(kāi)相同的對(duì)話框,如圖2-7所示。
圖2-7 “首選參數(shù)”對(duì)話框
為腳本上色有利于編寫(xiě)程序。使用這項(xiàng)功能時(shí),你將看到actionscript中的關(guān)鍵字以一種顏色顯示,而另外一些變量和常數(shù)以另外的顏色顯示。這對(duì)初學(xué)者是很有幫助的。如正確輸入關(guān)鍵字gotoandplay后,它馬上會(huì)以藍(lán)色顯示。如果它的顏色沒(méi)有發(fā)生變化,有可能就是你的輸入有誤。
動(dòng)作面板下拉菜單中還有導(dǎo)入導(dǎo)出文件以及打印等命令,可以將使用外部的文本編輯器編輯好的腳本導(dǎo)入到動(dòng)作面板中,或?qū)?dòng)作面板中的腳本導(dǎo)出或打印出來(lái)。
從外部導(dǎo)入腳本的方法并不值得推薦,因?yàn)閯?dòng)作面板雖然不是最快捷的文本編輯器,但是在其中編輯actionscript是最好的,你可以在需要的時(shí)候參照腳本分類目錄,可以即時(shí)的查看flash中的影片剪輯的名稱,查看幀編號(hào)或幀標(biāo)簽。另外,你還可以快捷地切換到flash影片中要插入腳本的任何位置。
2.5.3 在專家模式下輸入腳本
使用動(dòng)作面板的專家模式要比標(biāo)準(zhǔn)模式容易得多,因?yàn)樵趯<夷J较履阒恍枰脫翩I盤(pán),而不需要在窗口中填寫(xiě)表格。專家模式下的動(dòng)作面板就像一個(gè)簡(jiǎn)單的文本編輯器。
使用專家模式的缺點(diǎn)就是很容易出錯(cuò)。標(biāo)準(zhǔn)模式為你添加了很多限制,而在專家模式下你有可能鍵入不正確的命令或者將參數(shù)放錯(cuò)位置。
在專家模式下,你可以方便地將光標(biāo)定位在合適的位置。但是flash也不能完全任你隨心所欲,它會(huì)在你鍵入的同時(shí)自動(dòng)調(diào)整腳本格式,將不同的關(guān)鍵字設(shè)置成不同的顏色。
你可以單擊 按鈕以檢查腳本中的語(yǔ)法錯(cuò)誤,單擊 按鈕以格式化整個(gè)腳本,如在需要的位置換行、設(shè)置空格和縮進(jìn)等。
動(dòng)作面板還有代碼提示的功能。當(dāng)你鍵入腳本的時(shí)候有時(shí)會(huì)出現(xiàn)一個(gè)提示菜單,你可以忽略它繼續(xù)鍵入,或者從中選擇需要的項(xiàng)目。單擊 按鈕可以顯示代碼提示。
2.6 練習(xí):在專家模式下輸入腳本
下面我們練習(xí)在專家模式下輸入腳本。其操作步驟如下:
(1)新建一個(gè)文檔。
。2)選擇默認(rèn)的場(chǎng)景1圖層1中的第一個(gè)空白關(guān)鍵幀。
。3)按f9鍵打開(kāi)動(dòng)作面板。
。4)使用菜單將動(dòng)作面板切換到專家模式。
。5)在腳本編輯區(qū)單擊。
。6)鍵入下面的一行代碼:
gotoandplay(5);
第3章
actionscript編程初步
計(jì)算機(jī)程序是由命令、函數(shù)、運(yùn)算符、條件和循環(huán)等結(jié)構(gòu)組成的。命令是為計(jì)算機(jī)下達(dá)的一系列指令,函數(shù)執(zhí)行計(jì)算和返回值,通過(guò)運(yùn)算符將若干數(shù)據(jù)以某種特定的方式結(jié)合起來(lái),條件測(cè)試一個(gè)或多個(gè)值以返回一個(gè)為true或false的布爾值,循環(huán)結(jié)構(gòu)使得程序能夠重復(fù)執(zhí)行一系列相同的指令。
變量是存儲(chǔ)數(shù)據(jù)的容器,變量有變量名和變量值。
編程是一項(xiàng)需要耐心的工作,首先你必須理解要用程序解決什么樣的問(wèn)題,然后需要將這個(gè)問(wèn)題分解成若干步驟,將每個(gè)步驟再分成更小的步驟,直到每個(gè)步驟都小得很容易解決了為止。
程序編寫(xiě)好后,可能會(huì)存在許多漏洞或缺陷,所以你還需要對(duì)程序進(jìn)行調(diào)試,直到程序能正確運(yùn)行為止。
3.1 程序基本結(jié)構(gòu)
計(jì)算機(jī)程序是由命令、函數(shù)、運(yùn)算符、條件和循環(huán)等結(jié)構(gòu)組成的。
3.1.1 命令、函數(shù)和運(yùn)算符
在此之前,我們都是用關(guān)鍵字來(lái)描述actionscript中的元素,如關(guān)鍵字gotoandplay,它也是一個(gè)命令。
命令是actionscript中用來(lái)告訴flash所要執(zhí)行的特定操作的元素。之所以稱之為命令,就是因?yàn)樗鼘⒈粐?yán)格的遵照?qǐng)?zhí)行,如果要用gotoandplay跳轉(zhuǎn)到一個(gè)不存在的幀,這樣的命令就不能被執(zhí)行。
命令是程序中最基本的元素,在flash中如果不使用命令,幾乎不能進(jìn)行任何操作。從本書(shū)中你將學(xué)到很多命令。
函數(shù)是actionscript中用來(lái)執(zhí)行計(jì)算和返回結(jié)果的元素。例如,一個(gè)特定的函數(shù)可以計(jì)算并返回一個(gè)指定數(shù)的平方根。
命令和函數(shù)都可以使用參數(shù)。參數(shù)就是傳遞給命令或函數(shù)的一個(gè)值。如gotoandplay命令就至少需要一個(gè)幀編號(hào)或幀標(biāo)簽作為參數(shù)。求平方根的函數(shù)也需要一個(gè)數(shù)值作為參數(shù)。
與命令和函數(shù)不同的是運(yùn)算符,它們主要是一些符號(hào),而不是字母。例如,+運(yùn)算符執(zhí)行兩數(shù)相加的操作。
在actionscript程序中你將會(huì)用到大量的命令、函數(shù)和運(yùn)算符。
3.1.2 變量
要編寫(xiě)復(fù)雜的計(jì)算機(jī)程序往往需要存儲(chǔ)很多的信息。有時(shí)你可能只需要存儲(chǔ)很短暫的時(shí)間,例如,如果需要重復(fù)執(zhí)行10次相同的命令,你就需要對(duì)命令的執(zhí)行次數(shù)進(jìn)行記數(shù),直到滿10次為止。
所有的編程語(yǔ)言都使用變量來(lái)存儲(chǔ)信息。一個(gè)變量由兩部分構(gòu)成:變量名和變量的值。
1.變量名
變量名通常是一個(gè)單詞或幾個(gè)單詞構(gòu)成的字符串,也可以是一個(gè)字母?偟膩(lái)說(shuō),你需要盡可能地為變量指定一個(gè)有意義的名稱。
例如,如果你要使用變量存儲(chǔ)用戶的姓名,用username作為變量名將是一個(gè)很好的選擇。如果你使用n作變量名,似乎太短了一點(diǎn);如果使用name,又可能與影片中其他對(duì)象的名稱相混淆。
在actionscript中為變量指定變量名時(shí)已經(jīng)形成了一種不成文的規(guī)范,就是變量名通常以小寫(xiě)字母開(kāi)頭,當(dāng)一個(gè)新的單詞出現(xiàn)時(shí),大寫(xiě)這個(gè)新單詞的第一個(gè)字母,如username,長(zhǎng)一點(diǎn)的例子如currentuserfirstname。
變量名中不允許出現(xiàn)空格,也不允許出現(xiàn)特殊符號(hào),但是可以使用數(shù)字。
2.變量類型
你可以用變量存儲(chǔ)不同類型的數(shù)據(jù)。數(shù)字是最簡(jiǎn)單的變量類型。
你可以在變量中存儲(chǔ)兩種不同類型的數(shù)字:整數(shù)和浮點(diǎn)數(shù)。整數(shù)沒(méi)有小數(shù)點(diǎn)部分,如117、-3685都是整數(shù)。浮點(diǎn)數(shù)有小數(shù)點(diǎn)部分,如0.1、532.23、-3.7都是浮點(diǎn)數(shù)。
你也可以在變量中存儲(chǔ)字符串,字符串就是由字符組成的序列,可以是一個(gè)或多個(gè)字符,甚至可以沒(méi)有字符,即空字符串。
使用引號(hào)定義字符串,使其與其他變量相區(qū)別。如7是一個(gè)數(shù)字,而“7”則是一個(gè)字符串,這個(gè)字符串由一個(gè)字符7組成。
在別的編程語(yǔ)言中,你可能需要在程序的開(kāi)頭部分提前定義程序中要用到的變量的具體類型,但在actionscript中不需要預(yù)先聲明變量,你只需要直接使用它們,flash在第一次遇到它們的時(shí)候會(huì)自動(dòng)為它們創(chuàng)建變量。
另外,變量所能存放的數(shù)據(jù)類型也沒(méi)有嚴(yán)格的限定,某一變量可以在一個(gè)位置存放字符串,而在另一個(gè)位置存放數(shù)字。
這種靈活性并不是經(jīng)常用得到,但是它可以讓程序員們少一些不必要的擔(dān)心。
actionscript程序員不必?fù)?dān)心的另一個(gè)問(wèn)題是廢棄變量的空間回收問(wèn)題。即當(dāng)你不再需要使用一個(gè)變量的時(shí)候,你可能需要收回該變量占用的存儲(chǔ)空間。大多數(shù)現(xiàn)代的計(jì)算機(jī)語(yǔ)言如actionscript都可以自動(dòng)回收空間,所以你也不必?fù)?dān)心了。
除數(shù)字和字符串類型外還有一些別的變量數(shù)據(jù)類型。例如,數(shù)組可以存放一系列的數(shù)據(jù)而非單個(gè)數(shù)據(jù)。
3.1.3 條件
程序本身并不能作出抽象的決定,但是它可以獲取數(shù)據(jù),并對(duì)數(shù)據(jù)進(jìn)行分析比較,然后根據(jù)分析結(jié)果執(zhí)行不同的任務(wù)。
例如,你想要檢查用戶輸入的名字并確定其至少包含3個(gè)字母。程序需要做的事情就是對(duì)用戶名作出判斷,如果是3個(gè)或更多的字母,就執(zhí)行一種操作;如果不足3個(gè)字母則執(zhí)行另一種操作。
這里,作出一個(gè)決定需要兩步,第一步是檢查條件是否滿足,如果名稱符合3個(gè)字母長(zhǎng)度,條件滿足,我們稱條件的值為真 (true);否則條件不滿足,我們稱條件的值為假(false)。所有的條件都必須是兩個(gè)值中的一種,要么為真,要么為假。要么為真(true)要么為假(false)的數(shù)據(jù)類型稱為布爾(boolean)類型。
決定的第二步是根據(jù)條件為true或?yàn)閒alse的情況選擇要執(zhí)行哪些代碼。有時(shí)只有一個(gè)選項(xiàng),當(dāng)條件為true時(shí)執(zhí)行該選項(xiàng); 如果條件為false,將不執(zhí)行任何代碼。有時(shí)會(huì)有兩個(gè)相對(duì)的選項(xiàng),條件為true和false時(shí)分別執(zhí)行不同的代碼。
例如,你想讓計(jì)算機(jī)根據(jù)一個(gè)變量的值是1、2或3執(zhí)行3種不同的任務(wù),可以像這樣表達(dá):
如果變量的值等于1,執(zhí)行命令1
如果變量的值等于2,執(zhí)行命令2
如果變量的值等于3,執(zhí)行命令3
條件總是建立在比較之上的,你可以比較兩個(gè)變量的值以判斷它們是否相等;或者判斷一個(gè)是否大于另一個(gè),或是小于另一個(gè)。如果變量是字符串類型,你可以比較它們按字典順序排列時(shí)的先后次序。
3.1.4 循環(huán)
與人不同,計(jì)算機(jī)很適合做重復(fù)性的工作。一件事情僅僅重復(fù)幾次就可能使人厭倦,但是讓計(jì)算機(jī)重復(fù)執(zhí)行成千上萬(wàn)次它都照樣有耐心。
循環(huán)在每種編程語(yǔ)言中都是一個(gè)很重要的部分,actionscript也不例外。你可以指定一條指令執(zhí)行給定的次數(shù),或者令其執(zhí)行到滿足指定的條件為止。
事實(shí)上,條件是循環(huán)中的重要組成部分,整個(gè)循環(huán)只需要一個(gè)開(kāi)始點(diǎn),一個(gè)結(jié)束點(diǎn),再加上一個(gè)標(biāo)志循環(huán)結(jié)束的條件。
例如,你需要循環(huán)10次,使用一個(gè)變量從0開(kāi)始計(jì)數(shù)。每循環(huán)一次,計(jì)數(shù)加1。當(dāng)計(jì)數(shù)變量達(dá)到10時(shí),循環(huán)結(jié)束,程序繼續(xù)執(zhí)行循環(huán)以后的部分。下面的內(nèi)容代表了一個(gè)標(biāo)準(zhǔn)的循環(huán)結(jié)構(gòu):
(1)循環(huán)以前的命令。
(2)循環(huán)開(kāi)始,計(jì)數(shù)變量置0。
。3)循環(huán)中的命令。
。4)計(jì)數(shù)變量加1。
。5)如果計(jì)數(shù)變量小于10,執(zhí)行步驟(3)。
。6)循環(huán)以后的命令。
在上面的步驟中,步驟(1)只執(zhí)行1次,步驟(2)表示循環(huán)的開(kāi)始,步驟(3)、(4)、(5)都將執(zhí)行10次,當(dāng)循環(huán)結(jié)束后,執(zhí)行步驟(6)及以后的部分。
3.2 actionscript之一角
當(dāng)你在編寫(xiě)自己的腳本時(shí),你會(huì)用到各種各樣不同的關(guān)鍵字和符號(hào),為便于你熟悉腳本的構(gòu)成,下面先來(lái)看一個(gè)真實(shí)的例子。
這是一段作用于按鈕的腳本,當(dāng)用戶單擊按鈕時(shí)(確切地說(shuō)是松開(kāi)按下的按鈕時(shí))執(zhí)行它。其中沒(méi)有包含特殊的函數(shù),但是它體現(xiàn)了actionscript的主要結(jié)構(gòu)。
on (release) {
var mynumber = 7;
var mystring = "flash mx actionscript";
for (var i=0; i trace if (i + 3 == 8) { trace(mystring); } } } 腳本的第1行表明當(dāng)用戶松開(kāi)按下的按鈕時(shí)執(zhí)行大括號(hào)中的語(yǔ)句。on (release)結(jié)構(gòu)只能用于按鈕,其他相關(guān)的幾種用法如on(press)、on(rollover)、on(rollout)、on(dragover)、on(dragout)等。 第1行末尾的大括號(hào){表示一段相對(duì)獨(dú)立的代碼段的開(kāi)始。從{到與之相對(duì)的}之間的代碼是一個(gè)整體,它們都從屬于按鈕的release事件。 請(qǐng)注意,大括號(hào)之后的代碼較之第1行有一個(gè)制表符(按一次tab鍵)的縮進(jìn),其后的每行代碼與之具有相同的縮進(jìn)程度,直到一個(gè)新的大括號(hào)開(kāi)始,在新大括號(hào)后的語(yǔ)句會(huì)比前面的語(yǔ)句增加一個(gè)制表符的縮進(jìn),以此類推,這種特點(diǎn)與其他編程語(yǔ)言是類似的。flash會(huì)自動(dòng)將你添加的代碼設(shè)置成正確的縮進(jìn)樣式。 代碼的第1行創(chuàng)建一個(gè)名為mynumber的局部變量,并將該變量的值設(shè)置為7。下面一行將字符串flash mx actionscript賦給另一個(gè)變量mystring。稍后我們會(huì)更詳細(xì)的介紹變量的兩種類型:局部變量和全局變量。 分號(hào);表示一條指令的結(jié)束,在每個(gè)完整指令的末尾都應(yīng)該添加分號(hào)。 for代表一個(gè)循環(huán)結(jié)構(gòu)的開(kāi)始,此處的循環(huán)執(zhí)行7(mynumber)次,即令i從0遞增到6,每遞增1便執(zhí)行一次循環(huán)結(jié)構(gòu)中的語(yǔ)句。for后面大括號(hào)中的部分即為循環(huán)體。 命令trace將它后面括號(hào)中的內(nèi)容發(fā)送到輸出窗口。我們將在下一部分詳細(xì)介紹輸出窗口。 if是一種條件結(jié)構(gòu),它測(cè)試后面的內(nèi)容i + 3 == 8是否為true,如果為true,則執(zhí)行后面的語(yǔ)句;否則跳過(guò)該代碼段。 if結(jié)構(gòu)中只有一個(gè)trace命令,它將變量mystring的值發(fā)送到輸出窗口。 上例腳本以三個(gè)反向大括號(hào)}結(jié)束,第1個(gè)表示if語(yǔ)句的結(jié)束,第2個(gè)表示for語(yǔ)句的結(jié)束,第3個(gè)表示整個(gè)on(press)段結(jié)束。 3.3 輸出窗口 輸出窗口是只在測(cè)試flash影片時(shí)出現(xiàn)的一個(gè)編程工具,flash用它來(lái)顯示出錯(cuò)信息或其他的一些重要信息。用戶可以用actionscript中的trace命令自定義要發(fā)送到輸出窗口中的信息。 輸出窗口在測(cè)試程序時(shí)非常有用。你可以使用trace命令在輸出窗口中顯示變量的值或者哪一部分actionscript正在執(zhí)行。 輸出窗口還可以幫助你學(xué)習(xí)actionscript。你可以編寫(xiě)一些小程序,將信息發(fā)送到輸出窗口,這將幫助你看到程序的運(yùn)行結(jié)果。 要想熟悉輸出窗口,最好的方法就是多使用它。下面就來(lái)編寫(xiě)一段小程序,將信息發(fā)送到輸出窗口。 。1)啟動(dòng)flash mx。 (2)選中時(shí)間軸的第1幀,打開(kāi)第1幀的動(dòng)作面板。 。3)使用右上角的菜單將動(dòng)作面板切換到專家模式。 (4)在腳本編輯區(qū)單擊鼠標(biāo),將鼠標(biāo)光標(biāo)定位到腳本編輯區(qū)中。 (5)在動(dòng)作面板中輸入如下actionscript: trace("i like actionscript!"); 此時(shí)的動(dòng)作面板如圖3-1所示。 。6)按ctrl+enter鍵測(cè)試影片,因?yàn)槲枧_(tái)中沒(méi)有任何圖像,所以你將看到一個(gè)空白窗口,同時(shí)出現(xiàn)一個(gè)輸出窗口,窗口中顯示:i like actionscript!如圖3-2所示。 和動(dòng)作面板一樣,輸出窗口右上角也有一個(gè)下拉菜單,如圖3-3所示,其中包含了拷貝、清除、查找、保存到文件以及打印等命令。 下拉菜單的最后一項(xiàng)命令是“調(diào)試級(jí)別”,你可以選擇“錯(cuò)誤”、“警告”、“詳細(xì)”中的一種,如果選擇“無(wú)”,將不顯示任何信息。 3.4 actionscript基本語(yǔ)法 前面介紹了程序的基本結(jié)構(gòu),下面要講解actionscript中的基本語(yǔ)法。 3.4.1 變量 1.設(shè)置變量 在actionscript中使用變量的方法很簡(jiǎn)單,你只需要為變量名分配一個(gè)值,例如: myvariable = 7; 該例在創(chuàng)建名為myvariable的變量的同時(shí)將其值設(shè)置為7,你可以為變量任意取一個(gè)名字,而并不需要使用本例中的myvariable。 可以使用輸出窗口查看變量的值,如在一個(gè)空白影片第一幀的動(dòng)作面板中添加如下actionscript: x = 7; trace(x); 首先,數(shù)字7被存儲(chǔ)在變量x中;然后,使用trace命令將變量x的值發(fā)送到輸出窗口。影片播放時(shí),輸出窗口中會(huì)顯示數(shù)字7。 2.全局變量 根據(jù)變量作用的范圍不同可將變量分為全局變量和局部變量。 全局變量就是可以作用在整個(gè)flash影片的所有深度級(jí)別上的變量。你可以在某一幀中設(shè)置它,并在其他幀中使用和改變它的值。 你不需要使用特別的方法創(chuàng)建全局變量,像前一個(gè)例子一樣,直接設(shè)置并使用它,它自動(dòng)成為一個(gè)全局變量。 在許多編程語(yǔ)言中,全局變量可以在任何地方使用。flash影片使用一個(gè)概念叫層級(jí)(level)。整修影片的主時(shí)間軸作為根(root)層級(jí),影片剪輯是時(shí)間軸中的小影片。影片剪輯中的圖形和腳本要比根層級(jí)低一個(gè)級(jí)別。影片剪輯不能直接使用根層級(jí)中的全局變量。 3.局部變量 局部變量只能存在于當(dāng)前腳本中,而在其他幀中它將不再存在。你可以在使用同一個(gè)變量名在不同的幀中創(chuàng)建不同的局部變量,它們之間將互不影響。 局部變量可用來(lái)創(chuàng)建模塊化的代碼。當(dāng)前腳本執(zhí)行完時(shí),局部變量將被從內(nèi)存中刪除;而全局變量將保留到影片結(jié)束。 創(chuàng)建局部變量需要使用關(guān)鍵字var。例如,下面的actionscript創(chuàng)建值為15的局部變量mylocalvariable: mylocalvariable = 15; 使用var創(chuàng)建局部變量后,在當(dāng)前代碼中就不再需要使用關(guān)鍵字var了。例如,下面的代碼創(chuàng)建值為20的局部變量 mylocalvariable,然后將其值改為8,再發(fā)送到輸出窗口中。 var mylocalvariable = 20; mylocalvariable = 8; trace(mylocalvariable); 如果沒(méi)有特殊的需要,請(qǐng)盡量使用局部變量。 3.4.2 比較 在actionscript中比較兩個(gè)事物是很容易的,要進(jìn)行比較可以使用標(biāo)準(zhǔn)的數(shù)學(xué)符號(hào),如=、<、>等。 1.相等 在actionscript中用比較運(yùn)算符對(duì)兩個(gè)值進(jìn)行比較。 要比較兩個(gè)值是否相等,可以使用連在一起的兩個(gè)等于符號(hào)(==)。單個(gè)等于符號(hào)(=)是用來(lái)為變量分配值的,并不是比較運(yùn)算符。 如果要比較變量x的值是否等于7,就可以使用==符號(hào),如下所示: var x = 7; trace(x == 7); 以上代碼使用=符號(hào)將變量x設(shè)置為7,然后使用==符號(hào)對(duì)x和7進(jìn)行比較。 測(cè)試這兩行代碼,輸出窗口將顯示“true”。如果將x設(shè)置為8或其他數(shù),則會(huì)顯示“false”。 ==符號(hào)還可以用來(lái)比較兩個(gè)字符串。如下所示: var mystring = "hello actionscript."; trace(mystring == "hello actionscript."); trace(mystring == "hello actionscript."); 程序運(yùn)行時(shí),你將在輸出窗口中看到一個(gè)“true”和一個(gè)“false”,因?yàn)樵谧址凶帜甘且獏^(qū)分大小寫(xiě)的。 如果你要比較兩個(gè)值是否不等,可以使用!=符號(hào),它的意思是“不等于”。如下所示: var a = 7; trace(a != 9); trace(a != 7); 第1個(gè)trace語(yǔ)句顯示信息“true”,因?yàn)閍確實(shí)不等于9;第2個(gè)trace語(yǔ)句顯示信息“false”。 2.小于和大于 使用標(biāo)準(zhǔn)的數(shù)學(xué)符號(hào)<和>比較兩數(shù)是否成小于或大于關(guān)系。舉例如下: var a = 9; trace(a < 10); trace(a > 5); trace(a < 1); 你將從輸出窗口中看到“true”、“true”和“false”。 符號(hào)<=或>=用于比較一個(gè)數(shù)是否小于等于或大于等于另一個(gè)數(shù),如下所示: var a = 9; trace(a <= 9); trace(a >= 9); trace(a >= 7); 以上3個(gè)trace語(yǔ)句都將顯示“true”! 3.4.3 運(yùn)算 通過(guò)運(yùn)算可以改變變量的值。分別使用算術(shù)運(yùn)算符+、-、*、/執(zhí)行加、減、乘、除操作。 如下所示的actionscript將值為9的變量x加上一個(gè)數(shù)7: var x = 9; x = x + 7; trace(x); 運(yùn)算結(jié)果為16。 在actionscript中執(zhí)行運(yùn)算可以使用一些簡(jiǎn)寫(xiě)方法,如+=運(yùn)算符將其前后的值相加并將結(jié)果賦給它前面的變量。前面的腳本也可以寫(xiě)成如下的形式: var x = 9; x += 7; trace(x); ++運(yùn)算符與+=運(yùn)算符類似,但它每執(zhí)行一次,變量的值只增加1,如下面的例子: var x = 9; x++; trace(x); 結(jié)果顯示10。再看下面的例子: var x = 9; trace(x++); trace(x); 結(jié)果是9和10。為什么呢?因?yàn)榈?個(gè)trace語(yǔ)句輸出x的當(dāng)前值9,然后將x加1,輸出x的新值10。 再試一下下面的腳本: var x = 9; trace(++x); trace(x); 這次的結(jié)果為兩個(gè)10。因?yàn)閷?+運(yùn)算符置于變量前面,將先執(zhí)行運(yùn)算再返回變量的值。 同理,--運(yùn)算符執(zhí)行遞減操作,-=運(yùn)算符在變量當(dāng)前值的基礎(chǔ)上減去一個(gè)數(shù),*=運(yùn)算符在變量當(dāng)前值的基礎(chǔ)上乘上一個(gè)數(shù),/=運(yùn)算符在變量當(dāng)前值的基礎(chǔ)上除以一個(gè)數(shù)。 3.4.4 條件 既然現(xiàn)在你已經(jīng)知道如何比較兩個(gè)變量,你就可以將比較結(jié)果作為執(zhí)行某些語(yǔ)句的條件。 1.if語(yǔ)句 if語(yǔ)句使你可以使用比較結(jié)果控制flash影片的播放。如下所示的語(yǔ)句判斷x是否等于9,如果比較結(jié)果為true,則讓影片跳到第15幀: if (x == 9) { gotoandplay(15); } if語(yǔ)句以if開(kāi)始,其后緊跟一個(gè)比較表達(dá)式,比較表達(dá)式通常用一對(duì)括號(hào)括起來(lái),再后面即是用大括號(hào)括起來(lái)當(dāng)比較結(jié)果為true時(shí)要執(zhí)行的代碼。 2.else 對(duì)if語(yǔ)句可以進(jìn)行擴(kuò)展,使用else執(zhí)行條件不成立(比較表達(dá)式為false)時(shí)的代碼,如下所示: if (x == 9) { gotoandplay(15); } else { gotoandplay(16); } 你也可以使用else if語(yǔ)句將if語(yǔ)句更推進(jìn)一步,如下所示: if (x == 9) { gotoandplay(15); } else if (x == 10) { gotoandplay(16); } else if (x == 11) { gotoandplay(20); } else { gotoandplay(25); } 你可以讓if語(yǔ)句想要多長(zhǎng)就有多長(zhǎng),你也可以使用else if語(yǔ)句對(duì)別的變量進(jìn)行比較,如下所示: if (x == 9) { gotoandplay(15); } else if (y<20) { gotoandplay(16); } else { gotoandplay(25); } 3.復(fù)合比較 你可以在一個(gè)if語(yǔ)句中對(duì)幾個(gè)比較表達(dá)式的值進(jìn)行判斷,比如說(shuō)你希望在x為9并且y為20時(shí)跳轉(zhuǎn)到第10幀,可以使用如下所示的腳本: if ((x == 9) && (y == 20)) { gotoandplay(10); } 邏輯與運(yùn)算符&&將兩個(gè)比較表達(dá)式聯(lián)接在一起成為一個(gè)復(fù)合表達(dá)式,當(dāng)兩個(gè)表達(dá)式的值都為true時(shí)復(fù)合表達(dá)式的值才為true。每個(gè)比較表達(dá)式都需要添加獨(dú)立的括號(hào)以便flash能正確識(shí)別。在flash的早期版本中使用and執(zhí)行邏輯與運(yùn)算,現(xiàn)在已推薦不使用。 你也可以使用邏輯或運(yùn)算符||將兩個(gè)比較表達(dá)式聯(lián)接在一起成為一個(gè)復(fù)合表達(dá)式,只要有一個(gè)表達(dá)式的值為true,復(fù)合表達(dá)式的值就為true。如下所示: if ((x == 7) || (y == 15)) { gotoandplay(20); } 在該腳本中,只要x為7或者y為15,或者兩者都成立,結(jié)果都是跳轉(zhuǎn)到第20幀。只有當(dāng)兩者都不成立時(shí),才不會(huì)執(zhí)行 gotoandplay命令。在flash的早期版本中使用or執(zhí)行邏輯或運(yùn)算,現(xiàn)在已推薦不使用。 3.4.5 循環(huán) actionscript中的循環(huán)要比if語(yǔ)句稍微復(fù)雜一點(diǎn)。它的循環(huán)結(jié)構(gòu)與c語(yǔ)言中的循環(huán)結(jié)構(gòu)幾乎是一致的。 1.for循環(huán)結(jié)構(gòu) for結(jié)構(gòu)是主要的循環(huán)結(jié)構(gòu),其樣式如下所示: for (var i = 0; i<10; i++) { trace(i); } 運(yùn)行這段代碼,隨著局部變量i的改變,輸出窗口中將顯示數(shù)字0~9。 for結(jié)構(gòu)中關(guān)鍵字for后面的括號(hào)中包含3個(gè)部分,它們之間用分號(hào)隔開(kāi)。 第1部分聲明一個(gè)局部變量,在本例中創(chuàng)建了一個(gè)局部變量i并將其設(shè)置為0。該部分只在循環(huán)體開(kāi)始執(zhí)行之前執(zhí)行一次。 第2部分作為一個(gè)供測(cè)試的條件,在這里,測(cè)試i是否小于10。只要滿足該條件,就會(huì)反復(fù)執(zhí)行循環(huán)體。循環(huán)開(kāi)始的時(shí)候i等于0,它是小于10的,所以循環(huán)得以執(zhí)行。 第3部分是一個(gè)運(yùn)算表達(dá)式,每完成一次循環(huán)都將執(zhí)行該表達(dá)式一次。在這里,i每次遞增1,然后轉(zhuǎn)到第2部分對(duì)i的新值進(jìn)行判斷。 大括號(hào)中的部分是該循環(huán)的循環(huán)體,每執(zhí)行一次循環(huán)都將執(zhí)行其中的所有命令。我們來(lái)看看計(jì)算機(jī)是如何處理這個(gè)循環(huán)的。 聲明變量i并將其值設(shè)為0; 判斷條件i<10,結(jié)果為true,開(kāi)始執(zhí)行循環(huán)體; 現(xiàn)在i值為0,trace命令將i值發(fā)送到輸出窗口,輸出窗口顯示0; 第1次循環(huán)結(jié)束,回到循環(huán)開(kāi)始處,i在原來(lái)的基礎(chǔ)上遞增1,i值變?yōu)?; 判斷條件i<10,結(jié)果為true,繼續(xù)執(zhí)行循環(huán)體; trace命令將i的值1發(fā)送到輸出窗口; 然后i再加1,這樣循環(huán)下去直到執(zhí)行完10次循環(huán); 回到循環(huán)開(kāi)始處,i在原來(lái)的基礎(chǔ)上遞增1,i值變?yōu)?0; 判斷條件i<10,結(jié)果為false,結(jié)束循環(huán),開(kāi)始執(zhí)行for結(jié)構(gòu)后面的代碼。 2.其他形式的循環(huán)結(jié)構(gòu) for循環(huán)是最常用的一種循環(huán)結(jié)構(gòu),除for循環(huán)之外還有while循環(huán)和do…while循環(huán)。 while循環(huán)的例子如下所示: i = 0; while (i != 10) { trace(i); i++; } while循環(huán)看起來(lái)似乎要比f(wàn)or循環(huán)簡(jiǎn)單一些,從結(jié)構(gòu)上看甚至與if語(yǔ)句還有一些相似。只要while后面括號(hào)中的條件成立,循環(huán)就會(huì)一直進(jìn)行下去,所以在while循環(huán)體中需要有改變條件的語(yǔ)句,以使條件最終能夠?yàn)閒alse,完成循環(huán),如上例中的i++。 與while循環(huán)相似的是do…while循環(huán),如下所示: i = 0; do { trace(i); i++; } while (i != 10); 除了測(cè)試條件的位置不同,while循環(huán)和do…while循環(huán)幾乎是一樣的。while循環(huán)在循環(huán)體之前測(cè)試條件,do…while循環(huán)在循環(huán)體之后測(cè)試條件,所以do…while循環(huán)至少要執(zhí)行一次,而while循環(huán)有可能一次也不執(zhí)行。 3.跳出循環(huán) 所有的循環(huán)結(jié)構(gòu)都可以使用兩個(gè)命令改變循環(huán)的執(zhí)行流程,一個(gè)命令是break,另一個(gè)命令是continue。break命令終止循環(huán),并跳到循環(huán)結(jié)構(gòu)后面的語(yǔ)句處執(zhí)行;continue命令終止本輪循環(huán)但不跳出循環(huán),進(jìn)而執(zhí)行下一輪循環(huán)。 使用break和continue的例子都比較復(fù)雜,另外,還有一種特殊的for…in循環(huán)結(jié)構(gòu),在用到它們的時(shí)候我們?cè)僭敿?xì)講解。 3.4.6 函數(shù) 到現(xiàn)在為止,我們都是將腳本放在影片的第1幀中。如果程序相當(dāng)復(fù)雜,再放在同一幀中就使腳本顯得太龐大了。 函數(shù)使你可以組織需重用的代碼,并放在時(shí)間軸中,例如: function myfunction(mynum) { var newnum = mynum+5; return newnum; } 函數(shù)以關(guān)鍵字function開(kāi)頭,function后面是函數(shù)名。與變量名相似,你可以指定自己的函數(shù)名,最好將函數(shù)名取得有意義一些。 函數(shù)名后面的括號(hào)容納該函數(shù)的參數(shù),所謂參數(shù)也是一個(gè)變量,它的值在調(diào)用該函數(shù)時(shí)予以指定。一個(gè)函數(shù)可以有若干參數(shù),也可以沒(méi)有參數(shù)。無(wú)論有沒(méi)有參數(shù),函數(shù)名后都應(yīng)緊跟一對(duì)括號(hào)。 大括號(hào)中的部分是函數(shù)體,在函數(shù)體中創(chuàng)建了一個(gè)局部變量newnum,將mynum加5的結(jié)果設(shè)置為newnum的值。如果你將10作為參數(shù)傳遞給該函數(shù),newnum的值就是15。 return命令僅用于函數(shù)中,使用return結(jié)束一個(gè)函數(shù)并返回函數(shù)值。此處,newnum是用return命令返回的函數(shù)值。 要使用函數(shù),就需要調(diào)用它,如下所示: var a = myfunction(7); 該語(yǔ)句創(chuàng)建一個(gè)新的局部變量a,將7作為參數(shù)調(diào)用函數(shù)myfunction,并將函數(shù)返回的結(jié)果作為變量a的值。 被調(diào)用的函數(shù)開(kāi)始運(yùn)行,創(chuàng)建一個(gè)局部變量mynum,將7作為mynum的值,然后執(zhí)行函數(shù)體內(nèi)的代碼,使用return命令將 newnum的值12返回給函數(shù)的調(diào)用者。這時(shí),a的值變?yōu)?2。 函數(shù)最大的作用體現(xiàn)在它可以重復(fù)使用。如下所示的3行代碼產(chǎn)生3個(gè)不同的結(jié)果: trace(myfunction(3)); trace(myfunction(6)); trace(myfunction(8)); 運(yùn)行以上代碼,你將得到結(jié)果8、11和13。 使用函數(shù)還有一個(gè)好處就是可以只改變函數(shù)中的一處,從而影響所有調(diào)用該函數(shù)的命令。例如,將函數(shù)myfunction中的var newnum = mynum+5改成var newnum = mynum+7,上面3個(gè)調(diào)用該函數(shù)的命令的結(jié)果將變成10、13和15 3.4.7 點(diǎn)語(yǔ)法 actionscript中一個(gè)很重要的概念是點(diǎn)語(yǔ)法。點(diǎn)語(yǔ)法也是很多面向?qū)ο蟮木幊陶Z(yǔ)言中用來(lái)組織對(duì)象和函數(shù)的方法。 假設(shè)你想求一個(gè)數(shù)的絕對(duì)值,flash中有一個(gè)內(nèi)置的絕對(duì)值函數(shù),它包含在actionscript的“對(duì)象”/“核心”/“math”/“方法”中。要使用絕對(duì)值函數(shù),首先要使用對(duì)象名,即math,然后是方法名abs,它們之間用符號(hào)“.”隔開(kāi),具體表示方法 如下所示: var a = math.abs(-7); 點(diǎn)語(yǔ)法的另一個(gè)用途是指定影片剪輯的屬性。如下面的語(yǔ)句將影片剪輯mymc的_alpha(透明度)屬性設(shè)置為50%: mymc._alpha = 50; 你還可以在影片剪輯中使用點(diǎn)語(yǔ)法定位根(root)中的一個(gè)全局變量。如果你在主時(shí)間軸中創(chuàng)建了一個(gè)全局變量 globelvar,而要在影片剪輯中使用這個(gè)全局變量,可以使用如下的語(yǔ)句: trace(_root.globlevar); 如果你現(xiàn)在對(duì)對(duì)象、影片剪輯屬性、層級(jí)之類的概念 在調(diào)試器窗口中可以設(shè)置斷點(diǎn),斷點(diǎn)即是為某行代碼添加的一個(gè)標(biāo)記,當(dāng)調(diào)試影片時(shí),影片會(huì)自動(dòng)在斷點(diǎn)處停止,允許你查看當(dāng)前包括變量值在內(nèi)的的影片狀態(tài)。使用斷點(diǎn)可以使你逐行地執(zhí)行代碼,對(duì)每行代碼的運(yùn)行結(jié)果進(jìn)行觀察和分析。 初學(xué)actionscript的時(shí)候,你可能并不需要使用調(diào)試器;但是當(dāng)你成長(zhǎng)為一名經(jīng)驗(yàn)豐富的程序員時(shí),你就會(huì)發(fā)現(xiàn)它對(duì)你是非常有用的。 第4章 影片播放控制 控制影片播放流程的命令有許多,如下所示: stop:使影片停止在當(dāng)前時(shí)間軸的當(dāng)前幀中。 play:使影片從當(dāng)前幀開(kāi)始繼續(xù)播放。 gotoandstop:跳轉(zhuǎn)到用幀標(biāo)簽或幀編號(hào)指定的某一特定幀并停止。 gotoandplay:跳轉(zhuǎn)到用幀標(biāo)簽或幀編號(hào)指定的某一特定幀并繼續(xù)播放。 nextframe:使影片轉(zhuǎn)到下一幀并停止。 prevframe:使影片回到上一幀并停止。 stop命令常常用在幀動(dòng)作中,以使影片停 完成對(duì)按鈕的創(chuàng)建后,可以單擊舞臺(tái)上方的場(chǎng)景名“場(chǎng)景1”回到主場(chǎng)景。 按f1或ctrl+l打開(kāi)庫(kù)面板,你將看到庫(kù)中增加了一個(gè)按鈕,用鼠標(biāo)將它拖到舞臺(tái)中。 4.2.2 為按鈕添加腳本 要為按鈕添加腳本,首先得選中該按鈕,然后按f9鍵打開(kāi)動(dòng)作面板。你也可以在該按鈕上單擊鼠標(biāo)右鍵,在彈出的快捷菜單中選擇“動(dòng)作”命令,這樣也可以打開(kāi)按鈕的動(dòng)作面板。 在專家模式下輸入如下腳本: on (release) { trace("you are cliking me!"); } 按鈕的腳本有特殊的語(yǔ)法,即必須以關(guān)鍵字on開(kāi)頭,以on開(kāi)頭的代碼是一種事件處理函數(shù),即當(dāng)特定事件發(fā)生時(shí)要執(zhí)行的代碼。在這里,特定事件就是release(松開(kāi)鼠標(biāo)),它是按鈕最常用的事件。 按鈕事件還有press、releaseoutside、rollover、rollout、dragover、dragout以及keypress等。press是按下鼠標(biāo)事件,它在release事件之前發(fā)生,releaseoutside是在按鈕上按下鼠標(biāo),并且在按鈕外松開(kāi)鼠標(biāo)的事件,rollover是鼠標(biāo)指針移到按鈕所在熱區(qū)的事件,rollout是鼠標(biāo)從按鈕熱區(qū)移出的事件,dragover是在鼠標(biāo)指針位于按鈕上方并已按下按鈕的情況下,滑出按鈕再滑回按鈕的事件,dragout是當(dāng)鼠標(biāo)指針位于按鈕內(nèi)部,按下按鈕然后滾動(dòng)出按鈕區(qū)域的事件,keypress是按鈕響應(yīng)在鍵盤(pán)上按下某些鍵時(shí)的事件。 某種事件的發(fā)生,會(huì)觸發(fā)相應(yīng)事件處理函數(shù)開(kāi)始運(yùn)行,上例中使用trace語(yǔ)句將事件信息發(fā)送到輸出窗口中,使你可以更好地了解具體按鈕事件的含義。 4.3 練習(xí):演示文檔 用flash可以實(shí)現(xiàn)演示文檔的功能,演示文檔相當(dāng)于我們常說(shuō)的幻燈片,它可以進(jìn)行逐頁(yè)展示。如果不使用腳本,flash動(dòng)畫(huà)會(huì)很快地播放每一幀,要用flash制作演示文檔就得對(duì)flash添加控制命令。 我們用腳本使每一幀停止,要跳轉(zhuǎn)到別的幀,就需要使用按鈕。 制作演示文檔的操作步驟如下: 。1)啟動(dòng)flash mx,編輯前5幀。 。2)在文檔中創(chuàng)建5個(gè)按鈕,從庫(kù)面板中可以看到它們。 (3)打開(kāi)主時(shí)間軸第1幀的動(dòng)作面板,其中添加了如下語(yǔ)句: stop(); 影片播放時(shí),會(huì)停止在第一幀上。 。4)為圖層2的第1幀和第5幀分別添加幀標(biāo)簽begin和end,如圖4-3所示。 。5)選中第1幀中的“開(kāi)始”按鈕,打開(kāi)其動(dòng)作面板,在其中添加如下語(yǔ)句: on (release) { nextframe(); } 單擊“開(kāi)始”按鈕,停止在第1幀的影片會(huì)跳轉(zhuǎn)到第2幀并停止。 。6)分別在第2~4幀的相同位置添加按鈕“首頁(yè)”、“”、“末頁(yè)”。由于第5幀后面沒(méi)有別的幀,所以只添加“”按鈕添加腳本: on (release) { prevframe(); } 單擊“”按鈕添加腳本: on (release) { nextframe(); } 單擊“下一頁(yè)”按鈕,影片將從當(dāng)前幀跳轉(zhuǎn)到下一幀并停止。 。10)為所有“末頁(yè)”按鈕添加腳本: on (release) { gotoandstop("end"); } 單擊“末頁(yè)”按鈕,影片將從當(dāng)前幀跳轉(zhuǎn)到幀標(biāo)簽為end的那一幀并停止,在此處也即是第5幀。 。11)按ctrl+enter鍵測(cè)試一下影片,單擊各個(gè)按鈕試一下效果。這些添加了actionscript的按鈕是不是變得非常聽(tīng)話? 第5章 控制影片剪輯 影片剪輯是flash中最重要的一種元件,對(duì)影片剪輯的控制是actionscript的最重要功能之一。從根本上說(shuō),flash的許多復(fù)雜動(dòng)畫(huà)效果和交互功能都與影片剪輯的運(yùn)用密不可分。 使用點(diǎn)語(yǔ)法或方括號(hào)可以定位影片剪輯。使用方括號(hào)時(shí)可以使用由變量表示的影片剪輯實(shí)例名,這是它相對(duì)于點(diǎn)語(yǔ)法的優(yōu)點(diǎn)。 可以用腳本控制影片剪輯的各種動(dòng)作,也可以在影片剪輯的事件處理函數(shù)中控制主時(shí)間軸和別的影片剪輯。影片剪輯最重要的兩個(gè)事件是load和enterframe。 5.1 控制影片剪輯的播放動(dòng)作 設(shè)想一個(gè)flash動(dòng)畫(huà),它的主場(chǎng)景中只有一個(gè)幀,舞臺(tái)中只有一個(gè)影片剪輯,影片剪輯中并沒(méi)有actionscript。如何才能控制影片剪輯的播放動(dòng)作呢? 要控制一個(gè)影片剪輯,首先應(yīng)該為影片剪輯命名。容易混淆的是,庫(kù)面板中的影片剪輯本身有一個(gè)名稱,這里要命名的是場(chǎng)景中影片剪輯實(shí)例的名稱。它們可以相同,也可以不相同。如果你在場(chǎng)景中創(chuàng)建了同樣的影片剪輯的多個(gè)實(shí)例,那么就需要將每個(gè)實(shí)例以不同的名稱命名,才能用actionscript對(duì)每一個(gè)實(shí)例進(jìn)行控制。如果不需, 要對(duì)影片剪輯進(jìn)行控制,也就不需要為影片剪輯的實(shí)例命名。 從本例文件中,你將看, 到庫(kù)面板中只有一個(gè)影片剪輯rollmc,場(chǎng)景中創(chuàng)建了一個(gè)rollmc的實(shí)例。你還可以再?gòu)膸?kù)中拖出若干個(gè)rollmc的實(shí)例將它們放置到場(chǎng)景中。 選中場(chǎng)景中影片剪輯rollmc的實(shí)例,打開(kāi)屬性面板,可以看到它被命名為roll,你同時(shí)可以看到該影片剪輯原來(lái)的名字rollmc,如圖5-1所示。你也可以為它指定別的名稱,也可以是rollmc,flash并不會(huì)混淆它們之間的區(qū)別。 實(shí)例名稱可以在程序中用來(lái)指代該影片剪輯實(shí)例,如果要控制該實(shí)例,就需要在腳本中使用該名稱。下面,我們就來(lái)看看如何 通過(guò)腳本控制影片剪輯實(shí)例roll。 分別選中場(chǎng)景中的4個(gè)按鈕,打開(kāi)它們的動(dòng)作面板,查看其中的代碼。 “stop”按鈕: on (release) { roll.stop(); } 單擊“stop”按鈕使roll實(shí)例停 第6章 影片剪輯屬性 通過(guò)調(diào)整影片剪輯的各種屬性可以改變影片剪輯的位置和顯示狀態(tài)。_x和_y屬性代表影片剪輯在場(chǎng)景中的水平坐標(biāo)和垂直坐 標(biāo)。_xscale和_width屬性決定影片剪輯在水平方向上的顯示寬度,_yscale和_height屬性決定影片剪輯在垂直方向上的顯示高 度。使用_rotation屬性可以旋轉(zhuǎn)影片剪輯。_alpha屬性代表影片剪輯的透明度,_visible屬性決定影片剪輯是否可見(jiàn)。使用關(guān)鍵字 _xmouse和_ymouse可以獲取鼠標(biāo)光標(biāo)在屏幕中的坐標(biāo)位置。 6.1 坐標(biāo) flash場(chǎng)景中的每個(gè)對(duì)象都有它的坐標(biāo),坐標(biāo)值以像素為單位。flash場(chǎng)景的左上角為坐標(biāo)原點(diǎn),它的坐標(biāo)位置為0,0,前一個(gè)0表示水平坐標(biāo),后一個(gè)0表示垂直坐標(biāo)。flash默認(rèn)的場(chǎng)景大小為550×400像素,即場(chǎng)景右下角的坐標(biāo)為550,400,它表示距坐標(biāo)原點(diǎn)的水平距離為550,垂直距離為400。 場(chǎng)景中的每一點(diǎn)都可以用坐標(biāo)表示,如圖6-1所示標(biāo)注了若干點(diǎn)的坐標(biāo)位置。 習(xí)慣地,水平坐標(biāo)用x表示,垂直坐標(biāo)用y表示。在flash中,分別用_x和_y表示x坐標(biāo)值屬性和y坐標(biāo)值屬性。例如,要在主時(shí)間軸上表示場(chǎng)景中的影片剪輯mymc的位置屬性,可以使用下面的方法: mymc._x mymc._y 如果是在mymc自身的腳本中表示它的坐標(biāo),也以使用如下的方法: _x; _y; 或: this._x; this._y; 在屬性面板和信息面板中都有可以查看和更改對(duì)象的位置。選擇“窗口”→“信息”命令或按快捷鍵ctrl+i都可以打開(kāi)信息面板。 6.6 縮放屬性 影片剪輯的縮放屬性包括橫向縮放_(tái)xscale和縱向縮放_(tái)yscale。 _xscale和_yscale的值代表了相對(duì)于庫(kù)中原影片剪輯的橫向尺寸width和縱向尺寸height的百分比,而與場(chǎng)景中影片剪輯實(shí)例的尺寸無(wú)關(guān)。如庫(kù)中影片剪輯元件的橫向?qū)挾葹?50,在場(chǎng)景中將它的實(shí)例寬度調(diào)整為10,在腳本中將_xscale設(shè)置為50,則它在影片播放時(shí)顯示的橫向?qū)挾葘⑹?50的50%,即75,而不是50像素或10的50%。 當(dāng)_xscale和_yscale是0~100之間的數(shù)時(shí),縮小原影片剪輯;當(dāng)_xscale和_yscale是大于100的數(shù)時(shí),放大原影片剪輯;當(dāng) _xscale或_yscale為負(fù)時(shí),將在縮放的基礎(chǔ)上水平或垂直翻轉(zhuǎn)原影片剪輯。 本例文件包含了一個(gè)矩形的影片剪輯和一幅圖片,并將矩形所在圖層作為遮罩層,如圖6-4所示。 在矩形影片剪輯的動(dòng)作面板中添加如下actionscript: onclipevent (load) { xs = _width; ys = _height; } onclipevent (enterframe) { _xscale = 100*(_root._xmouse-_x)/(xs/2); _yscale = 100*(_root._ymouse-_y)/(ys/2); } 在load事件中,用變量xs和ys取得影片剪輯初始狀態(tài)下的寬度和高度值。在enterframe事件中,計(jì)算鼠標(biāo)位置與矩形影片剪輯中心的距離,算出它與矩形寬度和高度值的比值,然后作為_(kāi)xscale和_yscale的值。該動(dòng)畫(huà)實(shí)現(xiàn)移動(dòng)鼠標(biāo)位置以改變遮罩效果。 6.7 尺寸屬性 上面例子中我們用到了影片剪輯的另兩個(gè)屬性:_width和_height。與_xscale和_yscale屬性不同,_width和_height代表影片剪輯的絕對(duì)寬度和高度,而不是相對(duì)比例。 同樣可以使用_width和_height調(diào)整影片剪輯的尺寸大小,如上例中的actionscript也可寫(xiě)成如下所示: onclipevent (enterframe) { _width = math.abs(_root._xmouse-_x)*2; _height = math.abs(_root._ymouse-_y)*2; } math.abs是一個(gè)內(nèi)置函數(shù),用以計(jì)算一個(gè)數(shù)或表達(dá)式的絕對(duì)值。因?yàn)榕c縮放屬性不同,_width和_height的值不能為負(fù),所以這時(shí)使用絕對(duì)值函數(shù)始終給出一個(gè)不為負(fù)的值。 此處用更簡(jiǎn)潔的腳本實(shí)現(xiàn)了與上例相同的效果。 圖6-6 tabalball.fla文件的效果 該動(dòng)畫(huà)包含一支球桿影片剪輯stick,一個(gè)母球影片剪輯ball。在屏幕中移動(dòng)鼠標(biāo),球桿會(huì)跟隨鼠標(biāo)轉(zhuǎn)動(dòng),這是利用鼠標(biāo)位置控制球桿的_rotation屬性。球桿的影片剪輯中添加了一個(gè)隱性按鈕(只有最后1幀作為熱區(qū),前面3幀都有為空,所以是不可見(jiàn)的),當(dāng)單擊球桿時(shí),控制球桿影片剪輯向后播放,作回拉動(dòng)作,再出桿擊球。當(dāng)球桿前端回到球的輪廓位置時(shí),用球桿影片剪輯控制母球影片剪輯,將母球擊出,然后將其自身的_visible屬性設(shè)置為false,隱藏球桿。通過(guò)調(diào)整母球的_x和_y屬性,實(shí)現(xiàn)母球的滾動(dòng)、反彈等動(dòng)作。在母球滾動(dòng)時(shí),分析母球位置以判斷母球是否落袋,如果母球落袋,則使用trace語(yǔ)句給出提示“bad”,將母球重新置于初始位置。當(dāng)母球停止?jié)L動(dòng)時(shí),將球桿的_visible屬性重新設(shè)置為true,并將球桿的位置設(shè)置為與母球相同,等待下一次擊球。 球桿stick影片剪輯元件: 。1)在stick影片剪輯元件第1幀的幀動(dòng)作面板中添加如下語(yǔ)句: stop(); 。2)在第2、10、12幀中添加動(dòng)作,使球桿作回拉——出桿運(yùn)動(dòng)。第12幀時(shí)的球桿前端應(yīng)與中心保持相當(dāng)于母球半徑長(zhǎng)度即7.5像素的距離,在此幀時(shí)將母球擊出。 。3)在第12幀的動(dòng)作面板中添加如下actionscript: _root.motherball.v = 20; _root.motherball.dir = _root.stick._rotation; 上面的語(yǔ)句為motherball實(shí)例傳送兩個(gè)參數(shù)值v和dir,v代表了母球的運(yùn)動(dòng)速度,dir代表了母球的運(yùn)動(dòng)方向,它的方向與球桿的旋轉(zhuǎn)方向相同。 。4)在第13~20幀添加過(guò)渡,使球桿擊球后在場(chǎng)景中保留一段時(shí)間。 (5)在第20幀的動(dòng)作面板中添加如下actionscript: _visible = false; 該語(yǔ)句將球桿自身隱藏。 。6)將第1幀中的球桿轉(zhuǎn)換成按鈕,選中該按鈕,在動(dòng)作面板中添加如下actionscript: on (release) { play(); } 單擊該鈕,球桿往后播放,作擊球動(dòng)作。 球桿影片剪輯實(shí)例: 在主場(chǎng)景中將球桿和母球放在左邊,將它們的中心對(duì)齊。為球桿影片剪輯添加如下actionscript: onclipevent (load) { _x = _root.motherball._x; _y = _root.motherball._y; } onclipevent (mousemove) { xsm = _root._xmouse-_x; ysm = _root._ymouse-_y; if (xsm<0) { _rotation = math.atan(ysm/xsm)*(180/math.pi); } else { _rotation = math.atan(ysm/xsm)*(180/math.pi)+180; } } math.atan是flash的內(nèi)置函數(shù),用它求一個(gè)數(shù)或表達(dá)式的反正切值。math.pi是flash的內(nèi)置常數(shù),代表圓周率。使用math.atan計(jì)算出的反正切值的單位是弧度,而_rotation屬性的單位是角度,所以要將其乘以(180/math.pi)以實(shí)現(xiàn)弧度到角度的轉(zhuǎn)換。 在球桿影片剪輯的mousemove事件中,根據(jù)鼠標(biāo)位置調(diào)整_rotation屬性的值,使影片剪輯跟隨鼠標(biāo)轉(zhuǎn)動(dòng),這也是鼠標(biāo)跟隨動(dòng)畫(huà)中的一種。 母球影片剪輯實(shí)例: 在母球影片剪輯實(shí)例的動(dòng)作面板中添加如下actionscript: onclipevent (load) { v = 0; //初速度 dir = ""; //運(yùn)動(dòng)方向 vx = 0; //x方向分速度 vy = 0; //y方向分速度 slow = 0; //加速度 x0 = _x; //初始x位置 y0 = _y; //初始y位置 } onclipevent (enterframe) { //母球運(yùn)動(dòng)中 if ((dir != "") && (slow<100)) { //母球落袋 if (((_x<60) && (_y440) && (_y<85)) || ((_x265)) || ((_x>440) && (_y>265))) { _visible = false; trace("bad!"); dir = ""; v = 0; vx = 0; vy = 0; slow = 0; _x = x0; _y = y0; _visible = true; //在母球位置顯示球桿 _root.stick._visible = true; _root.stick.gotoandstop(1); _root.stick._x = x0; _root.stick._y = y0; } //撞擊球桌左邊界 if (_x440) { _x = 440; dir = 180-dir; } //撞擊球桌上邊界 if (_y265) { _y = 265; dir = -dir; } //調(diào)整母球位置和速度 v0 = v*(100-slow)/100; vx = v0*math.cos((dir)/(180/math.pi)); vy = v0*math.sin((dir)/(180/math.pi)); _x += vx; _y += vy; slow++; } //母球減速完畢 if (slow == 100) { //在母球位置顯示球桿 _root.stick._x = _root.motherball._x; _root.stick._y = _root.motherball._y; _root.stick._visible = true; //重置變量 dir = ""; v = 0; vx = 0; vy = 0; slow = 0; } } 第7章 影片剪輯方法 控制影片剪輯的方法很多,在actionscript中最常用和最有用的命令是duplicatemovieclip和attachmovie,它們用于復(fù)制和附加影片剪輯,這兩個(gè)命令可以實(shí)現(xiàn)許多效果,如下雪、棋類、射擊游戲等。 使用hittest方法可以代替按鈕實(shí)現(xiàn)人機(jī)交互,從這里也可以看出影片剪輯有多么強(qiáng)大的功能。 startdrag和stopdrag用于對(duì)影片剪輯進(jìn)行拖動(dòng),它們可以靈活地實(shí)現(xiàn)許多有趣的效果。 7.1 復(fù)制和附加影片剪輯 使用actionscript的一大理由便是它可以極大地提高工作效率,達(dá)到事半功倍的效果。本章要介紹的兩個(gè)命令 duplicatemovieclip和attachmovie便是其中的典范。 7.1.1 array對(duì)象 array對(duì)象(動(dòng)作面板的“對(duì)象”/“核心”目錄)即數(shù)組,它用來(lái)記錄成組的相關(guān)或相似變量。數(shù)組中的單個(gè)變量稱為元素,數(shù)組中的每個(gè)元素對(duì)應(yīng)一個(gè)索引,訪問(wèn)元素需要使用索引,索引需要用方括號(hào)括起來(lái)。 如下所示的actionscript創(chuàng)建一個(gè)空的數(shù)組: myarray = new array(); 如下所示的actionscript創(chuàng)建一個(gè)確定值的數(shù)組并在輸出窗口中顯示每個(gè)元素的值: weekday = new array("sun", "mon", "tue", "wed", "tur", "fri", "sat"); for (var i = 0; i<7; i++) { trace(weekday[i]); } 數(shù)組中還可以嵌套數(shù)組,即構(gòu)成多維數(shù)組,如下所示: polyarray = new array(); for (var i = 0; i<3; i++) { polyarray[i] = new array(i*3+1, i*3+2, i*3+3, i*3+4); trace(polyarray[i][0]+" "+polyarray[i][1]+" "+polyarray[i][2]+" "+polyarray[i][3]); } 輸出窗口中將顯示: 1 2 3 4 4 5 6 7 7 8 9 10 7.1.2 復(fù)制影片剪輯 duplicatemovieclip動(dòng)作(動(dòng)作面板的“動(dòng)作”/“影片剪輯控制”目錄)和movieclip對(duì)象(動(dòng)作面板的“對(duì)象”/“影片”目錄)中的duplicatemovieclip方法都用于在影片播放時(shí)創(chuàng)建影片剪輯的實(shí)例,也即復(fù)制場(chǎng)景中的父影片剪輯以產(chǎn)生新的影片剪輯。它們和后面要介紹的attachmovie方法對(duì)于要在影片中重復(fù)產(chǎn)生較多相同圖形或動(dòng)畫(huà)對(duì)象時(shí)非常有用,如棋類游戲、射擊游戲、鼠標(biāo)跟隨、下雪等特效動(dòng)畫(huà)。 要使用duplicatemovieclip動(dòng)作和movieclip.duplicatemovieclip方法,首先需要在場(chǎng)景中創(chuàng)建用來(lái)復(fù)制的父影片剪輯,并且在屬性面板中為該父影片剪輯實(shí)例命名,該影片剪輯實(shí)例名稱將作為duplicatemovieclip的參數(shù)之一。 在幀動(dòng)作中使用duplicatemovieclip動(dòng)作的方法如下所示: duplicatemovieclip("parentmc", "childmc", 10); 其中,第1個(gè)參數(shù)parentmc是父影片剪輯的唯一標(biāo)識(shí)符,第2個(gè)參數(shù)childmc是復(fù)制產(chǎn)生的新影片剪輯實(shí)例的唯一名稱,第3個(gè)參數(shù)10是新影片剪輯的深度級(jí)別(level)。深度級(jí)別的概念與層類似,較高深度級(jí)別中的圖形會(huì)遮擋住較低深度級(jí)別中的圖形,影片剪輯所在的深度級(jí)別越高就越貼近我們的視線。在同一個(gè)深度級(jí)別中只能有一個(gè)影片剪輯實(shí)例,如果在同一深度級(jí)別中添加多于一個(gè)影片剪輯實(shí)例,新的影片剪輯實(shí)例將替換掉舊的影片剪輯實(shí)例。 復(fù)制產(chǎn)生的影片剪輯實(shí)例與父影片剪輯實(shí)例的位置是重疊在一起的,所以一般還需要調(diào)整新影片剪輯實(shí)例的坐標(biāo)等屬性,以使其按照需要顯示,如下所示: _root.parentmc._visible = false; duplicatemovieclip("parentmc", "childmc", 10); _root.childmc._x = 275; _root.childmc._y = 200; 運(yùn)行以上腳本,屏幕中只能看到新影片剪輯實(shí)例,而父影片剪輯實(shí)例不見(jiàn)了。從這里也可以看出,父影片剪輯實(shí)例的屬性并不會(huì)影響到復(fù)制產(chǎn)生的新實(shí)例。 通常情況下,可以用與下面類似的方法復(fù)制多個(gè)影片剪輯實(shí)例: _root.parentmc._visible = false; n = 50; for (i=0; i duplicatemovieclip("parentmc", "childmc"+i, 10+i); _root["childmc"+i]._x = 25+10*i; _root["childmc"+i]._y = 8*i; } 在父影片剪輯中使用movieclip.duplicatemovieclip方法如下所示: onclipevent (enterframe) { this.duplicatemovieclip("childmc", 10); _root.childmc._x += 150; } 它比duplicatemovieclip動(dòng)作少了第1個(gè)參數(shù),即不需要父剪輯名稱。如果以上腳本不是在父剪輯而是在別的影片剪輯中,只需要將this換成父剪輯的實(shí)例名稱即可。 7.1.3 附加影片剪輯 attachmovie方法也是在影片播放時(shí)創(chuàng)建影片剪輯的實(shí)例,它與duplicatemovieclip不同的是,attachmovie方法不需要使用父影片剪輯,而是將庫(kù)中影片剪輯的實(shí)例附加到場(chǎng)景中。 要使用attachmovie方法,首先需要在庫(kù)面板中為要附加到場(chǎng)景中的影片剪輯添加鏈接。為影片剪輯添加鏈接的方法如下: 。1)在庫(kù)面板中要添加鏈接的影片剪輯上單擊鼠標(biāo)右鍵,在彈出的快捷菜單中選擇“鏈接”命令。 。2)系統(tǒng)彈出“鏈接屬性”對(duì)話框,如圖7-1所示。 。3)在“鏈接:”后選中“為動(dòng)作腳本導(dǎo)出”復(fù)選框,“為運(yùn)行時(shí) 為影片剪輯添加鏈接后,就可以在動(dòng)作腳本中調(diào)用它,如下所示: attachmovie("blackchess", "chess1", 100); 第1個(gè)參數(shù)即在庫(kù)面板中添加的鏈接名稱,第2個(gè)參數(shù)和第3個(gè)參數(shù)的意義和使用方法與duplicatemovieclip中相同位置的參數(shù)類似。 在使用attachmovie方法將影片剪輯實(shí)例附加到場(chǎng)景中后,該實(shí)例將默認(rèn)出現(xiàn)在場(chǎng)景左上角,即坐標(biāo)原點(diǎn)的位置,所以仍然需要調(diào)整它的位置等屬性。 7.1.4 刪除影片剪輯 通過(guò)以上方法創(chuàng)建的影片剪輯實(shí)例都可以使用removemovieclip動(dòng)作(動(dòng)作面板的“動(dòng)作”/“影片剪輯控制”目錄)或 movieclip對(duì)象的removemovieclip方法刪除,如下所示: n = 50; for (i=0; i removemovieclip(_root["childmc"+i]); } 7.2 練習(xí):動(dòng)態(tài)添加影片剪輯 本例是一個(gè)運(yùn)用了duplicatemovieclip和attachmovie命令的鼠標(biāo)跟隨特效動(dòng)畫(huà), 本例使用attachmovie命令將魚(yú)附加到場(chǎng)景中的,使用duplicatemovieclip命令復(fù)制荷花影片剪輯以調(diào)整它的深度級(jí)別,使其保持在魚(yú)的上面。 該文件只有兩層,圖層1用來(lái)處理魚(yú),圖層2用來(lái)處理荷花。場(chǎng)景中只添加了荷花影片剪輯,它的實(shí)例名稱與元件名稱同為picmc。在庫(kù)面板中為魚(yú)的身體元件設(shè)置了鏈接,鏈接標(biāo)識(shí)符與元件名稱相同。 。1)在圖層1的第1幀添加如下actionscript: unit = 20; //魚(yú)的分段數(shù):20 v0 = 12; //魚(yú)的游動(dòng)速度 v1 = 2/3; //魚(yú)身緊驟程度 v2 = 3; //魚(yú)身大小遞減速度 var x = new array(); //創(chuàng)建橫坐標(biāo)數(shù)組 var y = new array(); //創(chuàng)建縱坐標(biāo)數(shù)組 for (i=1; i<=unit; i++) { if (i == 1) { attachmovie("head", "fish"+i, unit+1-i); //在第1節(jié)附加魚(yú)頭 } else if ((i == 4) or (i == 13)) { attachmovie("fin", "fish"+i, unit+1-i); //在第4和13節(jié)附加魚(yú)鰭 } else { attachmovie("body", "fish"+i, unit+1-i); //在其他節(jié)附加魚(yú)身 } _root["fish"+i]._xscale = 50-v2*(i-1); //寬度遞減 _root["fish"+i]._yscale = 60-v2*(i-1); //高度遞減 _root["fish"+i]._alpha = 100-(100/unit)*i; //透明度遞減 } (2)在圖層1的第2幀添加如下actionscript: x[0] += (_xmouse-x[0])/v0; y[0] += (_ymouse-y[0])/v0; for (i=1; i<=unit; i++) { x[i] = x[i]+(x[i-1]-x[i])*v1; y[i] = y[i]+(y[i-1]-y[i])*v1; } //為數(shù)組元素賦值 for (i=1; i<=unit; i++) { _root["fish"+i]._x = (x[i-1]+x[i])/2; _root["fish"+i]._y = (y[i-1]+y[i])/2; _root["fish"+i]._rotation = 90+180/math.pi*math.atan2((y[i]-y[i-1]), (x[i]-x[i-1])); } //確定魚(yú)身各節(jié)坐標(biāo)位置和旋轉(zhuǎn)方向 。3)在圖層1的第3幀添加如下actionscript: gotoandplay(2); 該行語(yǔ)句令影片回到第2幀重新確定魚(yú)身各節(jié)的位置。 。4)將荷花影片剪輯picmc拖放到圖層2,并在屬性面板中將其實(shí)例命名為picmc。選中該影片剪輯實(shí)例,在其動(dòng)作面板中添加如下actionscript: duplicatemovieclip("picmc", "pic", 30); 該行語(yǔ)句復(fù)制荷花,并將其深度級(jí)別設(shè)為30。因?yàn)樵隰~(yú)身各節(jié)中,魚(yú)頭的深度級(jí)別最高,為20,這里只要是一個(gè)大于20的數(shù)即可將荷花置于魚(yú)的上面。 。5)按ctrl+enter測(cè)試影片。 第8章 響應(yīng)鍵盤(pán) 有4種方法可以檢測(cè)鍵盤(pán)上的按鍵動(dòng)作。第1種方法是使用按鈕,第2種方法是使用key對(duì)象,第3種方法是使用鍵盤(pán)偵聽(tīng),第4種方法是使用影片剪輯的keyup和keydown事件處理函數(shù)。 8.1 通過(guò)按鈕檢測(cè)按鍵動(dòng)作 在按鈕的on事件處理函數(shù)中不但可以對(duì)鼠標(biāo)事件作出響應(yīng),而且可以對(duì)鍵盤(pán)事件作出響應(yīng)。如在按鈕的動(dòng)作面板中加入如下所示的代碼,在敲擊鍵盤(pán)上的a鍵時(shí)輸出窗口中將提示:a is pressed。 on (keypress "a") { trace("a is pressed"); } 檢測(cè)鍵盤(pán)上的字母鍵時(shí),字母都應(yīng)為小寫(xiě)。如果要檢測(cè)鍵盤(pán)中的特殊鍵,如方向鍵,flash中有一些專門(mén)的代碼來(lái)表示它們,如表8-1所示。 表8-1 鍵盤(pán)中的特殊鍵 如要檢測(cè)鍵盤(pán)上的鍵,可以使用下面的actionscript: on (keypress "") { trace("end is pressed"); } 您可以在一個(gè)按鈕中加入若干個(gè)on函數(shù),也可以在一個(gè)on函數(shù)中結(jié)合多種事件,這使您可以為按鈕定義快捷鍵,如下所示: on (release, keypress "") { _root.mymc.prevframe(); } 上面的語(yǔ)句實(shí)現(xiàn)單擊按鈕或按鍵盤(pán)上的左方向鍵,控制影片剪輯mymc回退1幀。 8.2 影片剪輯的keyup和keydown事件 影片剪輯包含兩個(gè)與鍵盤(pán)相關(guān)的事件keyup和keydown,使用它們也可以實(shí)現(xiàn)對(duì)按鍵事件的響應(yīng),如下所示: onclipevent (keydown) { trace(key.getascii()); } 函數(shù)key.getascii返回與按鍵相對(duì)應(yīng)的ascii碼。ascii碼是一個(gè)整數(shù),鍵盤(pán)上的每個(gè)字符對(duì)應(yīng)一個(gè)ascii碼,如字母a對(duì)應(yīng)的ascii碼為65,b對(duì)應(yīng)的ascii碼為66,a對(duì)應(yīng)的ascii碼為97, b對(duì)應(yīng)的ascii碼為98,+對(duì)應(yīng)的ascii碼為43等。只有字符才有ascii碼,鍵盤(pán)上的功能鍵沒(méi)有ascii碼。 如果需要在輸出窗口中輸出與按鍵相對(duì)應(yīng)的字符,可以使用string對(duì)象的fromcharcode函數(shù)將ascii碼轉(zhuǎn)換成字符,如將上例的trace命令改成如下所示: trace(string.fromcharcode(key.getascii())); string對(duì)象見(jiàn)動(dòng)作面板的“對(duì)象”/“核心”目錄下面。 8.3 key對(duì)象 利用按鈕檢測(cè)按鍵動(dòng)作很有效,但是并不利于檢測(cè)持續(xù)按下的鍵,所以不適合于制作某些通過(guò)鍵盤(pán)控制的游戲。 這時(shí),您就需要用到key對(duì)象。key對(duì)象包含在動(dòng)作面板的“對(duì)象”/“影片”目錄下面,它由flash內(nèi)置的一系列方法、常量和函數(shù)構(gòu)成。使用key對(duì)象可以檢測(cè)某個(gè)鍵是否被按下,如要檢測(cè)左方向鍵是否被按下,可以使用如下actionscript: if (key.isdown(key.left)) { trace("the left arrow is down"); } 函數(shù)key.isdown返回一個(gè)布爾值,當(dāng)該數(shù)中的參數(shù)對(duì)應(yīng)的鍵被按下時(shí)返回true,否則返回false。常量key.left代表鍵盤(pán)上的左方向鍵。當(dāng)左方向鍵被按下時(shí),該函數(shù)返回true。 key對(duì)象中的常量代表了鍵盤(pán)上相應(yīng)的鍵,如表8-2所示。 表8-2 key對(duì)象中的常量 key.backspace key.enter key.pgdn key.capslock key.escape key.right key.control key.home key.shift key.deletekey key.insert key.space key.down key.left key.tab key.end key.pgup key.up 以上是鍵盤(pán)上的功能鍵,那么如何表示鍵盤(pán)上的字母鍵呢?key對(duì)象提供了一個(gè)函數(shù)key.getcode來(lái)實(shí)現(xiàn)這一功能,如下所示: if (key.isdown(key.getcode("a"))) { trace("a is pressed"); } 8.4 鍵盤(pán)偵聽(tīng) 假設(shè)在影片剪輯的onclipevent(enterframe)事件處理函數(shù)中檢測(cè)按鍵動(dòng)作,而影片剪輯所在的時(shí)間軸較長(zhǎng),或計(jì)算機(jī)運(yùn)算速度較慢,有可能出現(xiàn)這種情況,即當(dāng)在鍵盤(pán)上按下某個(gè)鍵時(shí)還未來(lái)得及處理onclipevent(enterframe)函數(shù),那么按鍵動(dòng)作將被忽略。 還有一個(gè)問(wèn)題就是,在某些游戲(如射擊)中,我們需要按一次鍵就執(zhí)行一次動(dòng)作(發(fā)射一發(fā)子彈),即使長(zhǎng)時(shí)間按住某個(gè)鍵不放也只能算作一次按鍵,而key對(duì)象并不能區(qū)別是長(zhǎng)時(shí)間按住同一個(gè)鍵還是快速地多次按鍵。 在解決這個(gè)問(wèn)題,就需要用到flash mx中的第3種方法:鍵盤(pán)偵聽(tīng)。when it comes to listening for key presses您可以使用 “偵聽(tīng)器(listener)”來(lái)偵聽(tīng)鍵盤(pán)上的按鍵動(dòng)作。 要使用偵聽(tīng)器首先需要?jiǎng)?chuàng)建它,您可以使用如下所示的命令來(lái)告訴計(jì)算機(jī)您需要偵聽(tīng)某個(gè)事件: key.addlistener(_root); key.addlistener命令將主時(shí)間軸或某個(gè)影片剪輯作為它的參數(shù),當(dāng)偵聽(tīng)的事件發(fā)生時(shí)可以用這個(gè)參數(shù)指定的對(duì)象來(lái)響應(yīng)該事件。 上面的代碼指定主時(shí)間軸來(lái)響應(yīng)該事件。要讓主時(shí)間軸對(duì)該事件作出響應(yīng),還需要設(shè)置一個(gè)相應(yīng)的事件處理函數(shù)。 鍵盤(pán)偵聽(tīng)的事件處理函數(shù)有兩個(gè):onkeyup和onkeydown,如下所示: _root.onkeyup = function() { trace(key.getascii()); }; 您也可以使用影片剪輯作為偵聽(tīng)鍵盤(pán)的對(duì)象,只需要使用影片剪輯的路徑代替_root作為key.addlistener命令的參數(shù)。 8.5 練習(xí):鍵盤(pán)控制影片剪輯 文件如圖8-1所示,可以通過(guò)鍵盤(pán)上的方向鍵控制影片剪輯運(yùn)動(dòng)。當(dāng)敲擊空格鍵時(shí),瓢蟲(chóng)回到初始位置。 點(diǎn)擊瀏覽該文件 圖8-1 鍵盤(pán)控制影片剪輯 文件ladybug.fla,其中包含了一個(gè)影片剪輯ladybug。在主場(chǎng)景中選中瓢蟲(chóng)影片剪輯,打開(kāi)其動(dòng)作面板,其中添加了如下 actionscript: onclipevent (load) { x0 = this._x; y0 = this._y; } onclipevent (enterframe) { if (key.isdown(key.space)) { this._x = x0; this._y = y0; this._rotation = 0; } if ((key.isdown(key.left)) && (key.isdown(key.up))) { this._x -= 10/math.sqrt2; this._y -= 10/math.sqrt2; this._rotation = -45; } else if ((key.isdown(key.left)) && (key.isdown(key.down))) { this._x -= 10/math.sqrt2; this._y += 10/math.sqrt2; this._rotation = -135; } else if ((key.isdown(key.right)) && (key.isdown(key.up))) { this._x += 10/math.sqrt2; this._y -= 10/math.sqrt2; this._rotation = 45; } else if ((key.isdown(key.right)) && (key.isdown(key.down))) { this._x += 10/math.sqrt2; this._y += 10/math.sqrt2; this._rotation = 135; } else if (key.isdown(key.left)) { this._x -= 10; this._rotation = -90; } else if (key.isdown(key.right)) { this._x += 10; this._rotation = 90; } else if (key.isdown(key.up)) { this._y -= 10; this._rotation = 0; } else if (key.isdown(key.down)) { this._y += 10; this._rotation = 180; } if (this._x>550) { this._x = 0; } if (this._x<0) { this._x = 550; } if (this._y>400) { this._y = 0; } if (this._y<0) { this._y = 400; } } 當(dāng)敲擊空格鍵(key.isdown(key.space))時(shí),影片剪輯回到初始位置;當(dāng)敲擊不同的方向鍵或方向鍵組合時(shí),相應(yīng)調(diào)整影片剪輯的_x、_y和_rotation屬性,從而實(shí)現(xiàn)以鍵盤(pán)控制影片剪輯。 第9章 輸入文本和字符串 flash中的文本形式有3種,即靜態(tài)文本、動(dòng)態(tài)文本和輸入文本。輸入文本可以接受用戶輸入,這也是響應(yīng)鍵盤(pán)事件的一種。輸入文本是一種人機(jī)交互工具,輸入文本作為變量可以被actionscript識(shí)別。 有許多方法可以操縱string(字符串)對(duì)象,如使用運(yùn)算符“+”連接字符串,使用substring和substr函數(shù)從目標(biāo)字符串中截取子字符串,使用indexof函數(shù)確定匹配字符串在目標(biāo)字符串中的位置等。 9.1 輸入文本 flash中的文本形式有3種,即靜態(tài)文本、動(dòng)態(tài)文本和輸入文本。輸入文本可以接受用戶輸入,這也是響應(yīng)鍵盤(pán)事件的一種。 3種形式的文本都是由文本工具 創(chuàng)建的,要?jiǎng)?chuàng)建輸入文本,首先要使用文本工具繪制一個(gè)文本框,然后在屬性面板中將該文本框的類型設(shè)置成輸入文本,如圖9-1所示,與輸入文本對(duì)應(yīng)的屬性面板如圖9-2所示。 在輸入文本的屬性面板中,除可以設(shè)置一般的文本格式外,還可以單擊 按鈕將文本顯示為html格式,單擊 按鈕為文本添加邊框,在 后面的下拉列表框中設(shè)置文本的換行格式或?qū)⑽谋驹O(shè)置成密碼顯示。 輸入文本最重要的是變量名,如圖9-2所示中的“變量”文本框,其中的myinputtext即是該輸入文本的變量名。輸入文本變量和其他變量類似,變量的值會(huì)呈現(xiàn)在輸入文本框中,輸入文本框中的值同時(shí)也作為輸入文本變量的值,它們之間是等價(jià)的。 如在場(chǎng)景中繪制了一個(gè)變量名為myinputtext的輸入文本框,然后在主時(shí)間軸的幀動(dòng)作面板中添加如下actionscript: key.addlistener(_root); _root.onkeydown = function() { trace(_root.myinputtext); }; 以上腳本創(chuàng)建一個(gè)鍵盤(pán)偵聽(tīng)器,當(dāng)按下鍵時(shí)即將輸入文本myinputtext中的內(nèi)容顯示在輸出窗口中。測(cè)試一下您可以看到,輸出窗口不會(huì)漏掉輸入的每個(gè)字符,并且每輸入一個(gè)字符即輸出一行。 9.2 字符串 字符串是一種特殊類型的數(shù)據(jù),對(duì)字符串可以進(jìn)行多種操作。 9.2.1 連接字符串 要連接兩個(gè)字符串,可以使用“+”運(yùn)算符。如下所示: var mystring = "hello"; mystring += " world."; trace(mystring); 輸出窗口中將輸出如下所示的字符串: hello world. 您可以在一行actionscript中使用多個(gè)“+”運(yùn)算符,如下所示: mystr1 = "how"; mystr2 = "are"; mystr3 = "you"; mystr = mystr1+" "+mystr2+" "+mystr3+"?"; trace(mystr); 輸出窗口中將輸出如下所示的字符串: how are you? 9.2.2 截取字符串 從字符串中可以截取它的子字符串。例如,下面的腳本從字符串中截取第5到第14個(gè)字符組成的子字符串: mystring = "actionscript is so useful!"; childstr = mystring.substring(4, 14); trace(childstr); 截取字符串函數(shù)substring有兩個(gè)參數(shù),第一個(gè)參數(shù)表示要截取的字符串的開(kāi)始位置,第2個(gè)參數(shù)表示要截取的字符串的結(jié)束位置。 輸出窗口中輸出如下所示的子字符串: onscript i 我們要截取的子字符串是從第5個(gè)開(kāi)始,為什么substring的參數(shù)中要從4開(kāi)始呢?這是因?yàn)樵赼ctionscript中,通常是從0開(kāi)始計(jì)數(shù)的,即上面的字符串中第0位上是a,第1位上是c,以此類推。那么既然從0開(kāi)始計(jì)數(shù),第14個(gè)字符就應(yīng)該是第13位,為什么第2個(gè)參數(shù)不是13而是14呢?這是因?yàn)閟ubstring的第2個(gè)參數(shù)是指要截取到的位置,即要截取的最后一個(gè)字符是它前面的一個(gè)字符,所以它應(yīng)該比要截取的最后一個(gè)字符多一位。 還有一種方法可以截取字符串,這就是substr。substr與substring命令的區(qū)別在于substr的第2個(gè)參數(shù)代表要截取的子字符串的長(zhǎng)度。如下所示的actionscript實(shí)現(xiàn)與前例相同的效果: mystring = "actionscript is so useful!"; childstr = mystring.substr(4, 10); trace(childstr); 在輸出窗口中輸出子字符串: onscript i 還有一個(gè)特殊的截取字符串的命令charat。charat可以從字符串的指定位置截取一個(gè)字符,如要從前面的字符串中截取第6位上的字符s,可以使用如下所示的actionscript: mystring = "actionscript is so useful!"; childstr = mystring.charat(6); trace(childstr); 輸出窗口中將輸出字符s。 9.2.3 字符串函數(shù) string對(duì)象有很多內(nèi)置函數(shù),使您可以對(duì)字符串進(jìn)行各種操作。 indexof方法用于從目標(biāo)字符串中查找另一字符串的索引,即與另一字符串相匹配的子字符串的起始位置。如下所示: mystring = "macromedia flash mx"; mystr = mystring.indexof("flash", 0); trace(mystr); 以上腳本從目標(biāo)字符串“macromedia flash mx”中查找字符串“flash”的位置,運(yùn)行該腳本,輸出窗口中輸出11。 如果目標(biāo)字符串中沒(méi)有找到相匹配的字符串,將返回-1。 indexof的第2個(gè)參數(shù)表示從目標(biāo)字符串中開(kāi)始查找的起始位置,前例中的0表示從目標(biāo)字符串的第1個(gè)字符開(kāi)始查找。該參數(shù)可以省略,將默認(rèn)從第1個(gè)字符開(kāi)始查找。 與indexof函數(shù)相對(duì)的是lastindexof,用它查找在參數(shù)所指定的開(kāi)始位置之前的最后一個(gè)子字符串的索引,即逆序查找。如下所示: mystring = "macromedia flash mx"; mystr = mystring.lastindexof("a", 12); trace(mystr); 運(yùn)行該腳本,輸出窗口中輸出9。 如果將參數(shù)12改成13或更大的數(shù),或?qū)⒃搮?shù)省略,將返回結(jié)果13。 string對(duì)象的tolowercase函數(shù)實(shí)現(xiàn)將大寫(xiě)字母轉(zhuǎn)換為小寫(xiě)形式,touppercase函數(shù)實(shí)現(xiàn)將小寫(xiě)字母轉(zhuǎn)換為大寫(xiě)形式。如下所示: mystring = "macromedia flash mx"; mystr1 = mystring.tolowercase(); mystr2 = mystring.touppercase(); trace("original string : "+mystring); trace("lowercase string : "+mystr1); trace("uppercase string : "+mystr2); 運(yùn)行該腳本,輸出窗口中顯示: original string : macromedia flash mx lowercase string : macromedia flash mx uppercase string : macromedia flash mx string對(duì)象只有一個(gè)屬性,即length,它表示字符串的長(zhǎng)度,即字符串中包含字符串的個(gè)數(shù),如下所示: mystring = "macromedia flash mx"; trace(mystring.length); 運(yùn)行該腳本,輸出窗口中顯示19,即該字符串中 用flash制作的表單 其中,第1個(gè)輸入文本框采用單行格式,第2個(gè)輸入文本框采用密碼格式,第3個(gè)輸入文本框采用多行格式,并設(shè)置了30像素的縮進(jìn)。3個(gè)輸入文本變量名分別為name、paword和words,使用actionscript分別控制3個(gè)文本框中的最大字符數(shù)。當(dāng)單擊按鈕clear時(shí),清除3個(gè)文本框中的內(nèi)容,當(dāng)單擊按鈕submit時(shí),提交所填的內(nèi)容。因?yàn)檫@里還沒(méi)學(xué)到flash與服務(wù)器的交互,所以將用 戶所填內(nèi)容通過(guò)輸出窗口顯示出來(lái)。 打開(kāi)文件form.fla,分別查看一下3個(gè)輸入文本框的屬性面板中的設(shè)置。 在主場(chǎng)景中新建一層actions,打開(kāi)其動(dòng)作面板,其中添加了如下actionscript: key.addlistener(_root); _root.onkeyup = function() { if (_root.name.length>8) { _root.name = _root.name.substr(0, 8); } if (_root.paword.length>16) { _root.paword = _root.paword.substr(0, 16); } if (_root.words.length>150) { _root.words = _root.words.substr(0, 150); } }; 以上腳本控制3個(gè)文本框中的最大字符數(shù),當(dāng)在文本框中輸入的字符數(shù)超過(guò)了限制,則使用substr函數(shù)從輸入的字符串中截取指定長(zhǎng)度的字符串。 選中按鈕clear,打開(kāi)其動(dòng)作面板,其中添加了如下actionscript: on (release) { _root.name = ""; _root.paword = ""; _root.words = ""; } 選中按鈕submit,打開(kāi)其動(dòng)作面板,其中添加了如下actionscript: on (release) { trace("welcome "+_root.name+" !"); trace("your password is "+_root.paword+" ."); } 第10章 動(dòng)態(tài)文本 在制作游戲的時(shí)候,有時(shí)需要一個(gè)文本框來(lái)記錄用戶的游戲得分,這個(gè)分?jǐn)?shù)是根據(jù)游戲情況動(dòng)態(tài)改變的。這時(shí)候,我們就需要用到動(dòng)態(tài)文本。 動(dòng)態(tài)文本與輸入文本的區(qū)別在于它不能直接接受用戶輸入。 但是,動(dòng)態(tài)文本可以用來(lái)顯示不同樣式和字體的文本。 10.1 動(dòng)態(tài)文本 和輸入文本一樣,使用文本工具可以創(chuàng)建動(dòng)態(tài)文本框,只需在屬性面板中選擇“動(dòng)態(tài)文本”即可,如圖10-1所示。 要讓動(dòng)態(tài)文本框動(dòng)態(tài)地顯示文本,就需要在屬性面板中為其設(shè)置變量名。如圖10-1所示,將動(dòng)態(tài)文本的變量名設(shè)為 mydynamictext。在flash影片播放時(shí),只需改變動(dòng)態(tài)文本變量的值,就可以改變動(dòng)態(tài)文本框中顯示的文本。 動(dòng)態(tài)文本有3種基本格式:?jiǎn)涡、多行和多行不換行,它沒(méi)有輸入文本的密碼格式。 屬性面板中間有3個(gè)按鈕,其中: = :可選,它決定了是否可以對(duì)動(dòng)態(tài)文本框中的文本執(zhí)行選擇、復(fù)制、剪切等操作,按下表示可選。如果是輸入文本,它是默認(rèn)按下并且不可改變的,因?yàn)檩斎胛谋疽欢ㄊ强蛇x的。 = :將文本呈現(xiàn)為html,它決定了動(dòng)態(tài)文本框中的文本是否可以使用html格式,即使用html語(yǔ)言為文本設(shè)置格式。 = :在文本周圍顯示邊框,它決定了是否在動(dòng)態(tài)文本框周圍顯示邊框。 怎樣才能讓動(dòng)態(tài)文本框顯示需要的文本呢?如下所示的腳本即在變量名為mydynamictext的動(dòng)態(tài)文本框中顯示 “welcome to actionscript!”: mydynamictext = "welcome to actionscript!"; 上面的腳本是加在動(dòng)態(tài)文本所在的時(shí)間軸上的。 動(dòng)態(tài)文本的使用雖然很簡(jiǎn)單,但是用它可以做許多事情。 10.2 html格式 html即超文本置標(biāo)語(yǔ)言,它是網(wǎng)頁(yè)格式的一種顯示規(guī)范。在瀏覽網(wǎng)頁(yè)時(shí),瀏覽器通過(guò)解讀html標(biāo)記將網(wǎng)頁(yè)中的各種元素顯示成需要的樣式。在flash中可以使用html來(lái)設(shè)置動(dòng)態(tài)文本的格式。要使用html,首先需要按下屬性面板中的 按鈕。在flash中使用html標(biāo)記為動(dòng)態(tài)文本設(shè)置格式的actionscript如下所示: 點(diǎn)擊放大 運(yùn)行該腳本,動(dòng)態(tài)文本框如圖10-2所示。 flash中使用的并不是完整的html,而只是html中的一些標(biāo)記,使用這些標(biāo)記可以輕松地為動(dòng)態(tài)文本設(shè)置各種格式。 flash mx中可用的所有html標(biāo)記如下所示: = :粗體 = :斜體 = :下劃線 = :設(shè)置字體 = :設(shè)置字號(hào) = :設(shè)置顏色 = :網(wǎng)頁(yè)超鏈接 = :定義段落 = :換行 10.3 從文本文件中獲取變量 通過(guò)actionscript可以調(diào)用flash影片外部文本文件中的變量。從外部文件中獲取變量的方法非常有用,它可以在不改變flash文件的基礎(chǔ)上對(duì)flash影片的內(nèi)容作出修改。例如要用flash制作一個(gè)天氣預(yù)報(bào)動(dòng)畫(huà),如果每天都對(duì)flash文件進(jìn)行修改就太麻煩了。而使用外部變量就只需要對(duì)文本文件作出修改。 要從外部文件中獲取變量需要用到的命令是loadvariables,如下所示: loadvariables("weather.txt", _root); 其中,第1個(gè)參數(shù)是flash影片要獲取變量的文件位置,第2個(gè)參數(shù)是文本變量要加載到的位置,可以是_root,也可以是某個(gè)影片剪輯或深度級(jí)別。flash將來(lái)自外部文件中的變量值加載到與指定位置中具有相同變量名的文本字段中。 使用loadvariables命令要注意的是,指定的文本應(yīng)以flash影片中的文本變量名開(kāi)始,否則不能被加載。本例weather.txt中的內(nèi)容如下所示: mydynamictext=today is friday,it's rainy! 打開(kāi)文件loadvariables.fla,在主時(shí)間軸中有一個(gè)動(dòng)態(tài)文本框,其變量名與weather.txt中的文本字段相同,當(dāng)運(yùn)行前面的腳本時(shí),該文本框中顯示: today is friday,it's rainy! 如果在文本文件中為變量指定多行字符串,flash將自動(dòng)識(shí)別換行符,從而實(shí)現(xiàn)自動(dòng)換行。 您可以修改文本文件中的內(nèi)容,flash中動(dòng)態(tài)文本顯示的內(nèi)容也將作出相應(yīng)的改變。 10.4 練習(xí):滾動(dòng)新聞 下面利用loadvariables命令和字符串函數(shù)制作如圖10-3所示的滾動(dòng)新聞欄。 圖10-3 滾動(dòng)新聞欄 (1)新建一個(gè)flash文檔并保存。 。2)在場(chǎng)景中繪制一個(gè)動(dòng)態(tài)文本框,在屬性面板中將其變量名設(shè)為text。 。3)選中文本框,按f8鍵將其轉(zhuǎn)換為影片剪輯元件,在屬性面板中將該影片剪輯實(shí)例命名為news。 。4)選中影片剪輯實(shí)例news,打開(kāi)其動(dòng)作面板,在其中添加如下actionscript: onclipevent (load) { loadvariables("news.txt", news); v = 0; } onclipevent (enterframe) { v++; if (v == 1) { text = text.substr(1, text.length-1)+text.substr(0, 1); v = 0; } } 在onclipevent(load)事件中使用loadvariables命令將外部文件news.txt中的文本調(diào)入到flash影片中。 變量v用來(lái)控制新聞滾動(dòng)的速度。 在onclipevent(enterframe)事件中使用string對(duì)象的substr方法將text中的字符串分拆重組,以實(shí)現(xiàn)字符串滾動(dòng)的效果。 。5)在與該flash文檔保存位置相同的位置創(chuàng)建一個(gè)文本文檔news.txt,在其中添加如下所示的字符: text=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 其中的text變量與flash中的動(dòng)態(tài)文本變量名相同,其后的字符串可以根據(jù)需要添加。測(cè)試影片 第11章 math對(duì)象 作為一門(mén)編程語(yǔ)言,進(jìn)行數(shù)學(xué)計(jì)算是必不可少的。在數(shù)學(xué)計(jì)算中經(jīng)常會(huì)使用到數(shù)學(xué)函數(shù),如取絕對(duì)值、開(kāi)方、取整、求三角函數(shù)值等,還有一種重要的函數(shù)是隨機(jī)函數(shù)。actionscript將所有這些與數(shù)學(xué)有關(guān)的方法、常數(shù)、三角函數(shù)以及隨機(jī)數(shù)都集中到一個(gè)對(duì)象里面——math對(duì)象。 math對(duì)象是actionscript的一塊敲門(mén)磚,只有掌握了它,才能真正對(duì)actionscript動(dòng)畫(huà)編程做到運(yùn)用自如。 11.1 math對(duì)象的方法 11.1.1 math.abs math對(duì)象中集合了許多常用數(shù)學(xué)函數(shù)。math.abs就是用來(lái)計(jì)算一個(gè)數(shù)的絕對(duì)值,即一個(gè)數(shù)去掉正負(fù)符號(hào)后的值。其用法如下: x=math.abs(-9); 或: x=math.abs(num1-num2); 11.1.2 math.round math.round方法將一個(gè)浮點(diǎn)數(shù)四舍五入為最接近的整數(shù),如: trace(math.round(9.4)); trace(math.round(9.5)); trace(math.round(-9.4)); trace(math.round(-9.5)); trace(math.round(-9.6)); 輸出窗口中將顯示: 9、10、-9、-9、-10 11.1.3 math.ceil、math.floor math.ceil方法取比一個(gè)浮點(diǎn)數(shù)大且最接近的整數(shù),math.floor方法取比一個(gè)浮點(diǎn)數(shù)小且最接近的整數(shù)。如: trace(math.ceil(9.1)); trace(math.floor(9.1)); trace(math.ceil(-9.1)); trace(math.floor(-9.1)); 輸出窗口中將顯示: 10、9、-9、-10 11.1.4 math.min、math.max math.min方法取兩個(gè)數(shù)中較小的一個(gè)數(shù),math.max方法取兩個(gè)數(shù)中較大的一個(gè)數(shù),如: trace(math.min(9, 8)); trace(math.max(9, 8)); 輸出窗口中顯示: 8、9 11.1.5 math.pow math.pow方法用來(lái)計(jì)算一個(gè)數(shù)的乘方,它包含兩個(gè)參數(shù),第1個(gè)參數(shù)是底數(shù)(要乘方的數(shù)),第2個(gè)參數(shù)是冪(乘方數(shù))。如計(jì)算5的3次方: trace(math.pow(5, 3)); 輸出窗口中顯示: 125 math.pow方法也可以計(jì)算一個(gè)數(shù)的開(kāi)方,如計(jì)算125的開(kāi)3次方: trace(math.pow(125, 1/3)); 輸出窗口中顯示 5 11.1.6 math.sqrt 除了用math.pow計(jì)算一個(gè)數(shù)的開(kāi)方,還可以使用math.sqrt計(jì)算一個(gè)數(shù)的平方根,如計(jì)算64的平方根: trace(math.sqrt(64)); 輸出窗口中顯示 8 它等同于: trace(math.pow(64, 1/2)); 11.2 math對(duì)象的常數(shù) math對(duì)象的常數(shù)有以下幾個(gè): = math.pi:圓周率(大約為3.141593)。 = math.sqrt1_2:1/2的平方根的倒數(shù)(大約為0.707107)。 = math.sqrt2:2的平方根(大約為1.414214)。 = math.e:歐拉(euler)常數(shù),自然對(duì)數(shù)的底(大約為2.718282)。 = math.ln2:2的自然對(duì)數(shù)(大約為0.693147)。 = math.ln10:10的自然對(duì)數(shù)(大約為2.302585)。 = math.log2e:e的以2為底的對(duì)數(shù)(大約為1.442695)。 = math.log10e:e的以10為底的對(duì)數(shù)(大約為0.434294)。 其中math.pi用得較多,如下面的腳本將弧度值arcdegree轉(zhuǎn)換為角度值angledegree: angledegree = arcdegree*(180/math.pi); 下面的actionscript將弧度1轉(zhuǎn)換為角度: arcdegree = 1; angledegree = arcdegree*(180/math.pi); trace(angledegree); 輸出窗口中顯示: 57.2957795130823 11.3 三角函數(shù) math對(duì)象中的三角函數(shù)有: = math.sin:正弦 = math.cos:余弦 = math.tan:正切 = math.asin:反正弦 = math.acos:反余弦 = math.atan:反正切 = math.atan2:從x坐標(biāo)軸到點(diǎn)的角度 三角函數(shù)在actionscript中有著舉足輕重的地位,它們?cè)谥谱饕恍┨匦?dòng)畫(huà)時(shí)將發(fā)揮重要的作用。 在程序語(yǔ)言中通常以x和y標(biāo)記位置,但是在一個(gè)圓周上使用x和y來(lái)標(biāo)記位置并不是很容易。三角函數(shù)在處理與圓周相關(guān)的位置參數(shù)時(shí)很有效。如用某個(gè)圓的圓心位置為(x0,y0),半徑為r,可以用y0+r*math.sin(0)表示該圓水平直徑右端點(diǎn)的縱坐標(biāo),用x0+r*math.cos(0)表示該圓水平直徑右端點(diǎn)的橫坐標(biāo)。如圖11-1所示用正弦函數(shù)和余弦函數(shù)標(biāo)出了一個(gè)圓周上4個(gè)點(diǎn)的坐標(biāo)。 如下所示的actionscript使影片剪輯繞圓周運(yùn)動(dòng): onclipevent (load) { i = 0; r = 150; x0 = 275; y0 = 200; } onclipevent (enterframe) { i += 10; this._x = x0+r*math.cos(i/(180/math.pi)); this._y = y0+r*math.sin(i/(180/math.pi)); } 此時(shí)的影片剪輯是沿順時(shí)針?lè)较蜣D(zhuǎn)動(dòng)的,如要讓它沿相反方向轉(zhuǎn)動(dòng),只需將i += 10改寫(xiě)成i -= 10即可。 actionscript中的三角函數(shù)都是按照弧度計(jì)算的。一個(gè)完整圓周的弧度數(shù)為2*math.pi,大約是6.283185,而一個(gè)圓周的角度數(shù)是360。如要在三角函數(shù)中使用角度數(shù),需要將其除以180/math.pi以轉(zhuǎn)換為弧度數(shù)。 在上面的腳本中,i的值是遞增的,而并沒(méi)有限定在0~360之間。這是因?yàn)檎液瘮?shù)和余弦函數(shù)是定義在負(fù)無(wú)窮~正無(wú)窮上的周期函數(shù),它們的值是以360°為周期循環(huán)的。 11.4 字符串和數(shù)字的轉(zhuǎn)換 在actionscript中,字符串和數(shù)字之間可以相互轉(zhuǎn)換。在很多時(shí)候,將字符串轉(zhuǎn)換為數(shù)字或?qū)?shù)字轉(zhuǎn)換為字符串都是很有必要的。例如,在flash中有一個(gè)變量名為n的輸入文本框和一個(gè)按鈕,按鈕中的actionscript如下: on (release) { trace(n+7); } 當(dāng)在輸入文本框中輸入11,再單擊按鈕時(shí),輸出窗口將顯示字符串“11”與字符串“7”相加的結(jié)果117,而不是數(shù)字11與數(shù)字7相加的結(jié)果8。這是因?yàn)閺妮斎胛谋究蛑蝎@得的是字符串,當(dāng)表達(dá)式中有字符串和數(shù)字時(shí),actionscript優(yōu)先考慮字符串,將數(shù)字轉(zhuǎn)換為字符串后再進(jìn)行字符串運(yùn)算。 為了將字符串轉(zhuǎn)換成數(shù)字,可以使用actionscript提供的函數(shù)number,如將上例所示的腳本改寫(xiě)成如下所示: on (release) { trace(number(n)+7); } 當(dāng)在輸入文本框中輸入11,再單擊按鈕時(shí),輸出窗口將顯示結(jié)果18。 如果number函數(shù)中的參數(shù)不能轉(zhuǎn)換成數(shù)字,則返回結(jié)果nan。 以“0x”開(kāi)頭的字符串將被解釋為十六進(jìn)制數(shù)。 對(duì)于布爾值,true將轉(zhuǎn)換為1,false將轉(zhuǎn)換為0。例如將上例所示的腳本改寫(xiě)成如下所示: on (release) { n = n>10; trace(number(n)); } 當(dāng)輸入的值小于等于10時(shí),輸出窗口中顯示0;當(dāng)輸入的值大于10時(shí),輸出窗口中顯示1。 除了number函數(shù)以外,函數(shù)parseint可以將字符串轉(zhuǎn)換成整數(shù),函數(shù)parsefloat可以將字符串轉(zhuǎn)換為浮點(diǎn)數(shù)。如將上例所示的腳本改寫(xiě)成如下所示: on (release) { trace(parseint(n)+7); trace(parsefloat(n)+7); } 當(dāng)在輸入文本框中輸入11.99,再單擊按鈕時(shí),輸出窗口中將顯示18和18.99。 parseint和parsefloat在處理字符串時(shí)比number函數(shù)更專業(yè)一點(diǎn),它們可以從字符串中取出能轉(zhuǎn)換成數(shù)字的最長(zhǎng)字符串進(jìn)行轉(zhuǎn)換,而忽略后面不能轉(zhuǎn)換成數(shù)字的字符串。如將上例的腳本改寫(xiě)成如下所示: on (release) { trace(number(n)+7); trace(parseint(n)+7); trace(parsefloat(n)+7); } 當(dāng)在輸入文本框中輸入11t7.9并單擊按鈕時(shí),輸出窗口中將顯示 nan、18、18 parseint函數(shù)可以有兩個(gè)參數(shù),第2個(gè)參數(shù)在2~36之間,表示要轉(zhuǎn)換的數(shù)字的基數(shù),即進(jìn)制數(shù)。如將二進(jìn)制數(shù)1101轉(zhuǎn)換為十進(jìn)制整數(shù): trace(parseint(1101, 2)); 輸出窗口中顯示13。 要將數(shù)字轉(zhuǎn)換成字符串可以使用number對(duì)象(動(dòng)作面板的“對(duì)象”/“核心”目錄)的tostring方法。要使用tostring方法需要先創(chuàng)建一個(gè)number對(duì)象,其用法如下: mynumber = new number(15); trace(mynumber.tostring(2)); trace(mynumber.tostring(16)); tostring中的參數(shù)與parseint函數(shù)的第2個(gè)參數(shù)一樣,都表示進(jìn)制數(shù)。本例中的2和16分別表示將mynumber轉(zhuǎn)換為二進(jìn)制數(shù)和16進(jìn)制數(shù)。運(yùn)行腳本,輸出窗口中顯示 1111 f 如果省略參數(shù),默認(rèn)為十進(jìn)制。 11.5 隨機(jī)數(shù) 隨機(jī)數(shù)在flash中的應(yīng)用非常廣泛。 在flash 5以前的版本中,使用random函數(shù)獲取一個(gè)近似的隨機(jī)數(shù),如random(10)隨機(jī)返回0~9這10個(gè)整數(shù)中的一個(gè)。但在flash mx中推薦使用math對(duì)象的random方法,即math.random(),該方法返回一個(gè)大于或等于0并且小于1的隨機(jī)浮點(diǎn)數(shù)。 math.random方法比random函數(shù)得到的結(jié)果更精確,但它并不能直接產(chǎn)生一個(gè)整數(shù)。我們可以使用別的辦法將 math.random方法產(chǎn)生的隨機(jī)數(shù)轉(zhuǎn)換為我們需要的整數(shù),如要得到一個(gè)1~10之間的隨機(jī)整數(shù),可以使用如下所示的 actionscript: trace(math.floor(math.random()*10+1)); 11.6 練習(xí):下雪 打開(kāi)文件snow.fla,這是一個(gè)利用attachmovie和math.random方法制作的下雪效果,其中每一片雪花的大小、方向各不相同,如圖11-2所示。 該動(dòng)畫(huà)中形狀各異的雪花與math.random函數(shù)密不可分,下面來(lái)看它的制作方法。 。1)在庫(kù)面板中為snow影片剪輯創(chuàng)建鏈接,其鏈接標(biāo)識(shí)符為snow,如圖11-3所示。 此主題相關(guān)圖片如下: 圖11-3 為影片剪輯添加鏈接 。2)將snow元件拖到場(chǎng)景中,選中該影片剪輯實(shí)例,在其中添加如下actionscript: onclipevent (load) { this._visible = false; v0 = 3; //速度 num = 50; //數(shù)量 vx = new array(); //記錄水平速度的數(shù)組 vy = new array();成 //記錄垂直速度的數(shù)組 for (var i = 1; i<=num; i++) { _root.attachmovie("snow", "snow"+i, i); //附加num個(gè)影片剪輯實(shí)例 scale = 100*math.random()+50; //隨機(jī)設(shè)定實(shí)例大小 with (_root["snow"+i]) { //with語(yǔ)句 _xscale = scale; _yscale = scale; _x = 500*math.random(); //隨機(jī)出現(xiàn)在影片水平寬度范圍 _y = 400*math.random(); //隨機(jī)出現(xiàn)在影片垂直高度范圍 _rotation = 360*math.random(); //隨機(jī)旋轉(zhuǎn)一個(gè)角度 vx[i] = v0*math.random()+v0; //隨機(jī)取得水平方向上的速度 vy[i] = v0*math.random()+v0; //隨機(jī)取得垂直方向上的速度 } } } onclipevent (enterframe) { for (var i = 1; i<=num; i++) { with (_root["snow"+i]) { _x += vx[i]; //在水平方向上運(yùn)動(dòng) _y += vy[i]; //在垂直方向上運(yùn)動(dòng) if (_x<0) { //超出左邊界,從右邊界進(jìn)入 _x = 500; } if (_x>500) { //超出右邊界,從左邊界進(jìn)入 _x = 0; } if (_y>400) { //超出下邊界,從上邊界進(jìn)入 _y = 0; } } } } 以上腳本除了用到數(shù)組、attachmovie、math.random等知識(shí)外,還用到了with動(dòng)作。with動(dòng)作用來(lái)為一組動(dòng)作腳本指定一個(gè)對(duì)象,如本例用with動(dòng)作指定對(duì)象_root["snow"+i],并在其后的大括號(hào)中對(duì)該對(duì)象的多種屬性進(jìn)行修改,從而避免了為每一個(gè)屬性重復(fù)指定相同的對(duì)象,使腳本更緊湊和更簡(jiǎn)化。;
朱峰社區(qū)網(wǎng)頁(yè)版(手機(jī)掃描-分享-添加到屏幕)
朱峰社區(qū)微信公眾號(hào)(微信掃一掃-關(guān)注)
未知用戶
2005-2025 朱峰社區(qū) 版權(quán)所有 遼ICP備2021001865號(hào)-1
2005-2025 ZhuFeng Community All Rights Reserved
VIP