完成對按鈕的創(chuàng)建后,,可以單擊舞臺上方的場景名“場景1”回到主場景。 按F1或Ctrl+L打開庫面板,,你將看到庫中增加了一個按鈕,,用鼠標將它拖到舞臺中。
4.2.2 為按鈕添加腳本 要為按鈕添加腳本,,首先得選中該按鈕,,然后按F9鍵打開動作面板。你也可以在該按鈕上單擊鼠標右鍵,,在彈出的快捷菜單中選擇“動作”命令,,這樣也可以打開按鈕的動作面板。 在專家模式下輸入如下腳本: on (release) { trace("You are cliking me!"); } 按鈕的腳本有特殊的語法,,即必須以關(guān)鍵字on開頭,,以on開頭的代碼是一種事件處理函數(shù),即當特定事件發(fā)生時要執(zhí)行的代碼,。在這里,,特定事件就是release(松開鼠標),它是按鈕最常用的事件,。 按鈕事件還有press,、releaseOutside、rollOver,、rollOut,、dragOver、dragOut以及keyPress等,。press是按下鼠標事件,,它在release事件之前發(fā)生,releaseOutside是在按鈕上按下鼠標,,并且在按鈕外松開鼠標的事件,,rollOver是鼠標指針移到按鈕所在熱區(qū)的事件,rollOut是鼠標從按鈕熱區(qū)移出的事件,,dragOver是在鼠標指針位于按鈕上方并已按下按鈕的情況下,,滑出按鈕再滑回按鈕的事件,dragOut是當鼠標指針位于按鈕內(nèi)部,,按下按鈕然后滾動出按鈕區(qū)域的事件,,keyPress是按鈕響應(yīng)在鍵盤上按下某些鍵時的事件,。 某種事件的發(fā)生,會觸發(fā)相應(yīng)事件處理函數(shù)開始運行,,上例中使用trace語句將事件信息發(fā)送到輸出窗口中,,使你可以更好地了解具體按鈕事件的含義。
4.3 練習:演示文檔 用Flash可以實現(xiàn)演示文檔的功能,,演示文檔相當于我們常說的幻燈片,,它可以進行逐頁展示。如果不使用腳本,,F(xiàn)lash動畫會很快地播放每一幀,,要用Flash制作演示文檔就得對Flash添加控制命令。 我們用腳本使每一幀停止,,要跳轉(zhuǎn)到別的幀,,就需要使用按鈕。 制作演示文檔的操作步驟如下: ?。?)啟動Flash MX,,編輯前5幀。 ?。?)在文檔中創(chuàng)建5個按鈕,,從庫面板中可以看到它們。 ?。?)打開主時間軸第1幀的動作面板,,其中添加了如下語句: stop(); 影片播放時,會停止在第一幀上,。 ?。?)為圖層2的第1幀和第5幀分別添加幀標簽begin和end,如圖4-3所示,。
(5)選中第1幀中的“開始”按鈕,打開其動作面板,,在其中添加如下語句: on (release) { nextFrame(); } 單擊“開始”按鈕,,停止在第1幀的影片會跳轉(zhuǎn)到第2幀并停止。 ?。?)分別在第2~4幀的相同位置添加按鈕“首頁”,、“上一頁”、“下一頁”,、“末頁”,。由于第5幀后面沒有別的幀,所以只添加“上一頁”和“首頁”兩個按鈕,。 ?。?)為所有“首頁”按鈕添加腳本: on (release) { gotoAndStop("begin"); } 單擊“首頁”按鈕,,影片將跳轉(zhuǎn)到幀標簽為begin的那一幀并停止,即第1幀,。這里也可以用1替代"begin",。 (8)為所有“上一頁”按鈕添加腳本: on (release) { prevFrame(); } 單擊“上一頁”按鈕,,影片將從當前幀跳轉(zhuǎn)到前一幀并停止,。 (9)為所有“下一頁”按鈕添加腳本: on (release) { nextFrame(); } 單擊“下一頁”按鈕,,影片將從當前幀跳轉(zhuǎn)到下一幀并停止,。 (10)為所有“末頁”按鈕添加腳本: on (release) { gotoAndStop("end"); } 單擊“末頁”按鈕,影片將從當前幀跳轉(zhuǎn)到幀標簽為end的那一幀并停止,,在此處也即是第5幀,。 (11)按Ctrl+Enter鍵測試一下影片,,單擊各個按鈕試一下效果。這些添加了ActionScript的按鈕是不是變得非常聽話,?
第5章 控制影片剪輯
影片剪輯是Flash中最重要的一種元件,,對影片剪輯的控制是ActionScript的最重要功能之一。從根本上說,,F(xiàn)lash的許多復(fù)雜動畫效果和交互功能都與影片剪輯的運用密不可分,。 使用點語法或方括號可以定位影片剪輯。使用方括號時可以使用由變量表示的影片剪輯實例名,,這是它相對于點語法的優(yōu)點,。 可以用腳本控制影片剪輯的各種動作,也可以在影片剪輯的事件處理函數(shù)中控制主時間軸和別的影片剪輯,。影片剪輯最重要的兩個事件是load和enterFrame,。
5.1 控制影片剪輯的播放動作 設(shè)想一個Flash動畫,它的主場景中只有一個幀,,舞臺中只有一個影片剪輯,,影片剪輯中并沒有ActionScript。如何才能控制影片剪輯的播放動作呢,? 要控制一個影片剪輯,,首先應(yīng)該為影片剪輯命名。容易混淆的是,,庫面板中的影片剪輯本身有一個名稱,,這里要命名的是場景中影片剪輯實例的名稱。它們可以相同,也可以不相同,。如果你在場景中創(chuàng)建了同樣的影片剪輯的多個實例,,那么就需要將每個實例以不同的名稱命名,才能用ActionScript對每一個實例進行控制,。如果不需要對影片剪輯進行控制,,也就不需要為影片剪輯的實例命名。 從本例文件中,,你將看到庫面板中只有一個影片剪輯rollmc,,場景中創(chuàng)建了一個rollmc的實例。你還可以再從庫中拖出若干個rollmc的實例將它們放置到場景中,。 選中場景中影片剪輯rollmc的實例,,打開屬性面板,可以看到它被命名為roll,,你同時可以看到該影片剪輯原來的名字rollmc,,如圖5-1所示。你也可以為它指定別的名稱,,也可以是rollmc,,F(xiàn)lash并不會混淆它們之間的區(qū)別。
實例名稱可以在程序中用來指代該影片剪輯實例,,如果要控制該實例,,就需要在腳本中使用該名稱。下面,,我們就來看看如何 通過腳本控制影片剪輯實例roll,。 分別選中場景中的4個按鈕,打開它們的動作面板,,查看其中的代碼,。 “STOP”按鈕: on (release) { roll.stop(); } 單擊“STOP”按鈕使roll實例停止播放。 “PLAY”按鈕: on (release) { roll.play(); } 單擊“PLAY”按鈕使roll實例繼續(xù)播放,。 “PREV”按鈕: on (release) { roll.prevFrame(); } 單擊“PREV”按鈕使roll實例回退一幀并停止,。 “NEXT”按鈕: on (release) { roll.nextFrame(); } 單擊“NEXT”按鈕使roll實例播放一幀并停止。 按Ctrl+Enter鍵測試影片,,如圖5-2所示,。一開始影片剪輯自動播放。單擊不同的按鈕看看影片剪輯是否執(zhí)行相應(yīng)的動作,。 欣賞:http://www./UpLoadFile/20039912202632549.swf 圖5-2 使用按鈕控制影片剪輯的播放動作 除了這幾種命令,你還可以使用gotoAndStop或gotoAndPlay命令控制影片剪輯跳轉(zhuǎn)到具體的幀,,但是在命令前面都需要指定影片剪輯的實例名稱,。 這種方法是在影片剪輯實例所在的層級中控制影片剪輯,如果是在影片剪輯內(nèi)部,要控制它自身的播放,,就可以直接使用stop,、play等命令,而不需要指定實例名稱,。如果你在影片剪輯內(nèi)部的時間軸中使用了名稱roll,,F(xiàn)lash會在影片剪輯內(nèi)部的時間軸中尋找該實例。
5.2 定位影片剪輯 我們已經(jīng)了解了如何使用最簡單的方法定位一個影片剪輯,,即使用影片剪輯的實例名,,后面緊跟一個點記號“.”,然后是你想要影片剪輯執(zhí)行的命令,。 還有許多方法可以定位影片剪輯,。首先,我們來看看如何定位Flash影片中不同層級的對象,。 Flash影片中最基本的目標層級就是它的主時間軸,。可以用關(guān)鍵字_root來表示和定位主時間軸,。 例如,,你要向主時間軸發(fā)送一個gotoAndStop命令,可以使用如下所示的語句: _root.gotoAndStop(9); 如果這個命令是包含在主時間軸的某一幀上的,,則可以省略目標_root,。如果這個命令是包含在主時間軸上某個影片剪輯中,需要由影片剪輯來控制它上一級的主時間軸,,_root就很有必要了,。 通常,要定位包含某一對象的上一級對象,,可以使用關(guān)鍵字_parent,。所以,如果一個影片剪輯是包含在主時間軸中,,在影片剪輯中使用_parent和_root的效果是一樣的,。如果影片剪輯與主時間軸相差兩個層級,即當影片剪輯包含在另一個位于主時間軸中的影片剪輯中,,這時在該影片剪輯中使用_parent指代的是它上一級的影片剪輯,,而_root是指它上兩級的主時間軸。在主時間軸中不能使用_parent,,因為主時間軸沒有上一級,。 可以用數(shù)字來方便地說明這種層級關(guān)系。主時間軸,,它始終是最初級,,作為層級0,。主時間軸中的一個影片剪輯處于層級1。如果影片剪輯中包含另一個影片剪輯,,它處于層級2,。對層級2上的影片剪輯來說,_parent指代的就是層級1上的影片剪輯,,而不管對哪一級來說,,_root始終指代層級0上的主時間軸。 除了用點記號連接_root和實例名,,還可以使用方括號表示_root上的對象,。對上例中的按鈕“STOP”來說,如下所示的3種方法作用是一樣的: rool.stop(); _root.roll.stop(); _root["roll"].stop(); 還有一個關(guān)鍵字this,,它代表腳本當前所在的層級,。如果腳本位于主時間軸中,this即指代主時間軸,;如果腳本位于影片剪輯中,,this即指代該影片剪輯。所以以上語句還可以用以下兩種方式表示: this.roll.stop(); this["roll"].stop(); 使用_root和this時還可以用變量來定位影片剪輯,,如下所示: var mcInsName = "roll"; _root[mcInsName].stop(); 今后我們會遇到這種情況,,即有roll0~rool99共100個影片剪輯實例,可以使用下面的語句來控制它們: on (release) { for (var i = 0; i<100; i++) { _root["roll"+i].stop(); } } 多數(shù)情況下我們習慣使用_root,,但在某些情況下使用this比_root更簡便,。如要在某個影片剪輯中定位包含 在此影片剪輯中的另一影片剪輯childMC,就可以直接使用this.childMC,。
5.3 為影片剪輯添加腳本 現(xiàn)在你已經(jīng)知道如何向幀和按鈕中添加腳本,,下面需要知道如何向影片剪輯中添加腳本。 要為影片剪輯添加腳本,,首先要選中影片剪輯,,再打開它對應(yīng)的動作面板,然后在其中輸入腳本,。影片剪輯腳本和按鈕的腳本類似,,它們都使用事件處理函數(shù),與按鈕的on關(guān)鍵字不同,,影片剪輯使用onClipEvent關(guān)鍵字,。當某種影片剪輯事件發(fā)生時,就會觸發(fā)相應(yīng)的事件處理函數(shù),。 影片剪輯最重要的兩種事件是load和enterFrame,。 load事件在影片剪輯完全加載到內(nèi)存中時發(fā)生。在每次播放Flash影片時,,每個影片剪輯的load事件只發(fā)生一次,。 在主時間軸停止播放時,,影片中的影片剪輯并不會停止播放,,這個特性決定了影片剪輯的另一個事件enterFrame的重要性,。enterFrame事件在影片每次播放到影片剪輯所在幀時發(fā)生。如果主時間軸中只有一幀,,且不論它是否在該幀停止,,該幀中的影片剪輯都會不斷觸發(fā)enterFrame事件,且觸發(fā)的頻率與Flash影片的幀頻一致,。 影片剪輯事件的使用方法如下所示: onClipEvent (load) { var i = 0; } onClipEvent (enterFrame) { trace(i); i++; } 當影片剪輯的load事件發(fā)生時,,將變量i設(shè)置為0。當影片剪輯的enterFrame事件發(fā)生時,,向輸出窗口中發(fā)送i的值,,然后將i加1。輸出窗口中會從0開始輸出以1遞增的數(shù)字序列,,直到影片被關(guān)閉為止,。 為了熟悉影片剪輯事件處理函數(shù)的用法,我們來為影片剪輯編寫一段簡單的腳本,,使影片剪輯逆序播放,, 我們將從影片剪輯的最后一幀處開始播放,使用prevFrame命令使影片剪輯每次后退一幀,。 本例文件場景中有一個影片剪輯元件rollmc,,查看一下它的屬性面板,并沒有為其實例命名,,這是因為我們要直接在影片剪輯的動作面板中添加腳本,,并不需要用到實例名稱。 選中影片剪輯rollmc,,此時動作面板的標題欄中應(yīng)為“動作-影片剪輯”,。打開動作面板,其中添加了如下ActionScript: onClipEvent (load) { gotoAndStop(40); } onClipEvent (enterFrame) { prevFrame(); } 在事件處理函數(shù)onClipEvent (load)中,,令Flash影片的播放頭轉(zhuǎn)到影片剪輯的第40幀(即最后一幀),。這個事件處理函數(shù)只在影片剪輯被加載完成時執(zhí)行1次。第2個事件處理函數(shù)onClipEvent (enterFrame)每播放1幀就執(zhí)行1次,,使影片剪輯回退1幀,。 按Ctrl+Enter鍵測試影片,你將看到齒輪以與上例相反的方向轉(zhuǎn)動,,直到影片剪輯的時間軸回到第1幀,,prevFrame命令不起作用,影片剪輯停止播放,。要讓它連續(xù)不斷的播放,,可以在影片剪輯元件rollmc的時間軸第1幀的動作面板中添加如下語句: gotoAndStop(40);
5.4 用影片剪輯控制別的影片剪輯 一個影片剪輯可以控制別的影片剪輯,。綜合使用_root或_parent關(guān)鍵字、點符號和影片剪輯實例名稱可以將命令發(fā)送給另一個影片剪輯實例,。例如,,在主時間軸上的影片剪輯實例roll1中添加如下腳本以控制同在主時間軸上的影片剪輯實例roll2回退1幀: _root.roll2.prevFrame(); 或者使用方括號表示如下: _root["roll2"].prevFrame(); 如果兩個影片剪輯不同在主時間軸上,而是同在別的層級上,,可以使用_parent關(guān)鍵字,。如果它們不同在一個層級上,也只需要使用點符號逐級標明所在的路徑即可,。 下面綜合運用以上知識實現(xiàn)以影片剪輯控制另一個剪輯的播放動作,。 (1)打開本例文件,。分別查看場景中的每一層,。按Ctrl+L打開庫面板。庫面板中有三個影片剪輯元件,,分別是hour,、minute和second。 ?。?)分別雙擊每個影片剪輯元件,,查看它們的時間軸。 ?。?)second元件的的時間軸共60幀,,secondhand圖形元件順時針旋轉(zhuǎn)1周。在第1幀中添加了如下ActionScript: stop(); 在最后1幀中添加了如下ActionScript: _root[target].nextFrame(); gotoAndStop(1); ?。?)minute元件的的時間軸共60幀,,minutehand圖形元件順時針旋轉(zhuǎn)1周。在第1幀中添加了如下ActionScript: stop(); 在最后1幀中添加了如下ActionScript: _root[target].nextFrame(); gotoAndStop(1); ?。?)hour元件的的時間軸共12幀,,hourhand圖形元件順時針旋轉(zhuǎn)1周。在第1幀中添加了如下ActionScript: stop(); ?。?)回到主場景,,在屬性面板中為hour影片剪輯和minute影片剪輯指定了與元件名稱相同的實例名稱。 ?。?)選中second元件實例,,打開其動作面板,其中添加了如下ActionScript: onClipEvent (load) { target = "minute"; } onClipEvent (enterFrame) { nextFrame(); } ?。?)選中minute元件實例,,打開其動作面板,其中添加了如下ActionScript: onClipEvent (load) { target = "hour"; } 以上腳本的原理是:使每個影片剪輯都在各自的第1幀停止,。在second的enterFrame事件中令其自身移到下一幀,。直到 second元件轉(zhuǎn)動完一周,,到達最后一幀,使用_root[target].nextFrame();命令將target所指目標后移1幀,,這里的target是在second影片剪輯實例的load事件中定義的,,也就是minute。同樣,,直到minute元件轉(zhuǎn)動完一周到達最后1幀,,使用_root[target].nextFrame();命令將target所指目標后移1幀,這里的target是在minute影片剪輯實例的load事件中定義的,,也就是hour。 由于影片剪輯的轉(zhuǎn)動是由nextFrame命令實現(xiàn)的,,所以在每個元件內(nèi)部時間軸的最后1幀中添加了跳轉(zhuǎn)到第1幀的語句,,避免停止在最后1幀上。 上面的ActionScript主要有兩種,,一種是在影片剪輯內(nèi)部時間軸上的幀腳本,,另一種是在主時間軸中的影片剪輯腳本。我們使用一個全局變量target記錄影片剪輯實例名稱,,這個動作是在影片剪輯的事件處理函數(shù)中完成的,,然后將這個全局變量應(yīng)用到影片剪輯內(nèi)部的幀腳本中。從這里也可以看到,,影片剪輯動作和影片剪輯內(nèi)部的幀動作是可以進行通信的,,全局變量在它們之間有效,但在兩個影片剪輯之間就變得無效,,所以我們可以在兩個影片剪輯中同時使用target而互不影響,。 (9)按Ctrl+Enter測試影片,,如圖5-3所示,。
|