為影片剪輯添加鏈接后,就可以在動(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幀添加如下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; //透明度遞減 } ?。?)在圖層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)方向 ?。?)在圖層1的第3幀添加如下ActionScript: gotoAndPlay(2); 該行語(yǔ)句令影片回到第2幀重新確定魚(yú)身各節(jié)的位置。 ?。?)將荷花影片剪輯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ú)的上面。 ?。?)按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)中的特殊鍵,如方向鍵,F(xiàn)lash中有一些專門(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,即該字符串中共19個(gè)字符。 在使用String對(duì)象的函數(shù)和屬性時(shí)要注意,字母的大寫(xiě)形式和小寫(xiě)形式是有區(qū)別的,并且每個(gè)空格也作為一個(gè)字符。
9.3 練習(xí):表單 表單(form)在網(wǎng)頁(yè)中使用得非常頻繁,用戶可以通過(guò)表單與服務(wù)器進(jìn)行交互,從而實(shí)現(xiàn)注冊(cè)或登錄等操作。 借助于輸入文本、按鈕以及ActionScript等,也可以用Flash來(lái)制作網(wǎng)頁(yè)中的表單。
|