|
原文地址:http://www./kejianjiaocheng/kj (24).html 老虎注:照該文去作,效果出不來。但該文提出了“呈現(xiàn)運動軌跡”的思路和方法,這對初學(xué)動作腳本的我來說,簡直就是指路明燈。按該思路和方法,自己可以試著去作:圓、橢圓、正弦曲線、拋物線及其他曲線等。 Flash有著豐富的腳本命令(ActionScript),flash課件制作者可以通過編制程序的方法來控制對象的運動或?qū)傩?,以達(dá)到最佳的演示效果。在許多教學(xué)flash課件(尤其是物理flash課件)中,經(jīng)常需要將對象運動的軌跡呈現(xiàn)出來,這是怎樣實現(xiàn)的呢? 也許有些讀者會說:這不容易嗎?使用運動向?qū)?,?fù)制向?qū)Ь€到另一圖層不就成了?!NO!NO!,我要強(qiáng)調(diào)指出,用向?qū)哟_實也可以實現(xiàn)運動效果或顯示運動路線,但這種方法做出的是初級動畫,充其量是Flash的初級運用,它不能實現(xiàn)flash課件的高級交互效果!設(shè)想一個物體做隨機(jī)的拋體運動,你能用向?qū)邮箤ο笤谶\動時同時顯現(xiàn)軌跡嗎?答案是否定的。因此,筆者將在本文向大家介紹使用FlashActionScript來實現(xiàn)對象的運動并顯示運動軌跡的方法,這是Flash課件制作的一個重要技巧之一。 也許我們可用VB或VC輕易繪出各類曲線、軌跡,但在Flash中顯現(xiàn)運動軌跡卻顯得有點復(fù)雜,因為Flash5.0以下版本不支持畫線功能,如果希望運動對象在運動時同時顯現(xiàn)軌跡,那我們只好選取一個折中方案:復(fù)制對象! Flash有一個復(fù)制對象命令:duplicateMovieClip,此命令可以復(fù)制影片剪輯(MovieClip)對象,是flash課件制作的重要命令。我們先來認(rèn)識這個命令,該命令的語法是: duplicateMovieClip(target, newname, depth); 語法中的“target”為要復(fù)制的目標(biāo)對象名,“newname”為新對象名,“depth”為新對象的深度。 從數(shù)學(xué)角度看,所有的線都是由點組成的,如果點足夠密,就可以變成直線、曲線了,甚至是面了!這也是我們呈現(xiàn)對象軌跡的腳本設(shè)計基本思想。如果按顯示軌跡的常見類型看,我們可將其顯示軌跡的情形分為兩種:一種是直接顯現(xiàn)物 體出現(xiàn)的各個位置,另一種是顯現(xiàn)物體運動時經(jīng)過的路線。這兩種顯示效果怎樣才能實現(xiàn)呢?請往下看吧! 一、顯現(xiàn)物體出現(xiàn)的各位置 為了更好說明問題,請啟動Flash新建一個電影,用繪圖工具中的橢圓工具(Oval Tool)繪制一個填充色為漸進(jìn)色的小球,再用箭頭工具(Arrow Tool)選定小球圖形后點擊Insert → Convert toSymbol(F8)將圖形轉(zhuǎn)換成一個Movie Clip對象,繼續(xù)點擊Window → Panels → Instance(Ctrl+I)開啟Instance面板,將實例名命名為”boll”。這個小球?qū)嵗龑⑹俏覀兿旅嬉肁ction控制運動的主要對象。 在圖層Layer 1的第一幀上按一次F5鍵,插入一個幀(Frame),再在圖層 Layer 1上點擊右鍵,在彈出的菜單中選Properties,將圖層名改為“symbol”后按“OK”。 點擊Insert →Layer插入一個新圖層,在此圖層的第一幀上按一下F6插入一個關(guān)鍵幀(Keyframe),將此新的圖層改名為“actions”。這里我說明一下:圖層symbol是用于放置代碼中調(diào)用的影片剪輯對象(文中提到的小球?qū)ο蟆癰oll”和下面提到的小點對象“dd”)用的,該圖層有兩幀;圖層actions用于放置腳本命令,由兩個關(guān)鍵幀組成,見圖。 在actions圖層的第一關(guān)鍵幀上點擊右鍵彈出菜單選Actions,開啟action編輯面板并輸入以下代碼: t=t+0.1; setProperty ('/boll', _x, 100*Math.sin(t)+300); setProperty ('/boll', _y, 100*Math.cos(t)+200); 在actions圖層的第二關(guān)鍵幀上輸入以下代碼: gotoAndPlay(1); 請按Ctrl+Enter測試一下影片,你會看到上述代碼執(zhí)行后,小球“boll”對象以(300,200)(像素)位置為圓心,以半徑100(像素)不停的做勻速圓周運動。如果要將對象經(jīng)過的每個位置都顯示出來,則可以利用復(fù)制影片剪輯命令duplicateMovieClip,讓運動小球經(jīng)過每個位置時都復(fù)制出一個同樣的小球。請試著修改上面的代碼為: 第一關(guān)鍵幀 t=t+0.1; setProperty ('/boll', _x, 100*Math.sin(t)+300); setProperty ('/boll', _y, 100*Math.cos(t)+200); duplicateMovieClip (“/boll”, 'copy' + n, n); n = Number (n) + 1; 第二關(guān)鍵幀: gotoAndplay(1); 按Ctrl+Enter測試一下電影,看看效果,你看到了復(fù)制出的對象了嗎? 上述代碼由于使用了duplicateMovieClip命令,程序運行復(fù)制對象命令定時對小球boll進(jìn)行同步復(fù)制。每執(zhí)行一次第一幀,系統(tǒng)復(fù)制一個當(dāng)前的boll對象,并取名為copyn,n是個遞加的值,若n初始值為1,則復(fù)制出的對象將依次被命名為copy1、copy2、copy3等等,這些復(fù)制出的對象按照運動對象經(jīng)過的位置依次排列,就將運動對象的軌跡呈現(xiàn)了出來。 隨便指出;代碼 n = Number (n) + 1 中的Number(n)是用于強(qiáng)制n為數(shù)值而不是字符,這點很重要,否則flash可能會把n視為字符而將其當(dāng)成字符串來連接,不能實現(xiàn)遞加。不過讀者也會發(fā)現(xiàn),這些密集的復(fù)制對象嚴(yán)重影響了flash課件的效果,而且變量t的累進(jìn)值越小,復(fù)制出的對象越密。另外還有個問題就是隨著運動的繼續(xù),復(fù)制出的對象也越來越多,眾多的復(fù)制對象不僅會使flash課件運行速度變慢,還會使軌跡變得慘不忍睹。別急,我們有辦法解決,請再修改上面的代碼為: 第一關(guān)鍵幀 t=t+0.1; j = j+0.1;//計數(shù)器 setProperty ('/boll', _x, 100*Math.sin(t)+300); setProperty ('/boll', _y, 100*Math.cos(t)+200); if (t<=6.28)>=6.28)> if (j==0.5) { duplicateMovieClip ('/boll', 'copy'+n, n); n = Number(n)+1; j = 0;//重新歸零 }//判斷j是否累加到了0.5,若是就復(fù)制對象 }//強(qiáng)制復(fù)制對象只在旋轉(zhuǎn)不到一周時發(fā)生 第二關(guān)鍵幀: gotoAndplay(1); 再測試一次看看,沒事了吧!原來我們在代碼中加入了條件語句,這樣不僅可定時(t累加到0.5時)復(fù)制對象,而且只能讓復(fù)制對象指令在小球運動不足一周時(t=6.28即為一周)進(jìn)行,這樣就解決了前面代碼存在的問題。你看過閃光照相嗎?這種顯現(xiàn)物體運動位置的代碼方法就很適宜制作模擬閃光照相效果的flash課件。 二、顯現(xiàn)運動路線 前面那種方法是通過復(fù)制一定數(shù)量的對象,把對象經(jīng)過的位置反映出來,但很多時候我們需要顯示的只是對象運動時經(jīng)過的路線,這時又該怎樣實現(xiàn)呢? 思路也很簡單,那就是再建立一個“小點”對象,讓小點對象跟隨物體做同樣運動,然后在運動過程中即時復(fù)制出“小點”罷了。設(shè)想復(fù)制小點對象足夠多且足夠密,那不就成了一條路線了嗎?我們來試試吧! 此法要建立一個新對象——小點,因此我們先準(zhǔn)備好這個用于繪線的小點。選定 symbol圖層,用繪圖工具中的畫筆工具(BrushTool)在工作區(qū)繪出一個足夠小的圓點(1×1),用箭頭工具選定后,點擊Insert → Convert toSymbol(F8)將其轉(zhuǎn)換成Movie Clip對象,名字就叫dd;再點擊Window → Panels →Instance(Ctrl+I)開啟Instance面板把對象實例名也取作dd。 在上述影片的action圖層的關(guān)鍵幀上輸入以下代碼: 第一幀 t=t+0.1; setProperty ('/boll', _x, 100*Math.sin(t)+300); setProperty ('/boll', _y, 100*Math.cos(t)+200); setProperty ('/dd', _x, 100*Math.sin(t)+300); setProperty ('/dd', _y, 100*Math.cos(t)+200); duplicateMovieClip ('/dd', 'copy'+n, n); n = Number(n)+1; 第二幀 gotoAndplay(1); 點擊測試影片就能看到小球運動的路線軌跡了,如果變量 t遞加值足夠小或復(fù)制出的小點對象足夠多時,小球?qū)ο蟮倪\動路線就會變得很圓滑。此代碼方法可用于一般的運動flash課件。 三、運動軌跡的優(yōu)化 由于運動軌跡是由大量復(fù)制出的對象排列而成,我們可能會遇到以下幾個需要解決的問題: 1、避免對象復(fù)制得過密或過疏影響軌跡美觀; 2、限制對象復(fù)制數(shù)目,防止對象復(fù)制過多影響程序運行速度(flash中的Movie clip越多,運行速度越慢); 3、擦除軌跡。 關(guān)于第一個問題,解決辦法是調(diào)節(jié)自變量的賦值速度,以上述圓周運動代碼為例,我們可以將t的每次遞加值增加或減少來控制復(fù)制對象的疏密。如把t+0.1改為 t+0.5 則可以使復(fù)制對象變疏,反之改為t+0.05 則變密。 第二個問題則可以用條件語句判斷復(fù)制數(shù)目后對復(fù)制遞加數(shù)n重新賦以初始值。請看以下代碼: 第一幀 t = t + 0.1; setProperty ('/boll', _x, 100*Math.sin(t)+300); setProperty ('/boll', _y, 100*Math.cos(t)+200); setProperty ('/dd', _x, 100*Math.sin(t)+300); setProperty ('/dd', _y, 100*Math.cos(t)+200); if (n >=800) { n = 1; } duplicateMovieClip ('/dd', “copy” +n , n); n = Number (n) + 1; 第二幀 gotoAndplay(1); 觀察代碼可以看出,上述代碼通過條件語句,判斷出復(fù)制對象數(shù)是否大于或等于800,如果是就將n重新賦值為1,讓其從1開始重新遞加,這樣新復(fù)制的MovieClip會逐步替代以前的復(fù)制Movie Clip,確保了復(fù)制出的對象不會超過800個。 第三個問題通常解決辦法是利用移除對象命令removeMovieClip,此命令的語法是: removeMovieClip(target) 命令中的target是要移除的目標(biāo)對象。由于要移除的對象較多,一般的辦法是設(shè)計一個擦除按鈕,利用循環(huán)控制語句來自動移除復(fù)制對象,例如在擦除按鈕上輸入以下代碼: on (release) { while (Number(n) != 0) { bn = 'copy'+n; removeMovieClip (bn); n = Number(n)-1; } } 點擊按鈕時就能移除所有的復(fù)制對象。當(dāng)然我們還可以在幀命令中插入移除代碼,利用條件語句來觸發(fā)移除對象指令,具體怎樣編制代碼,請讀者參照上述代碼自己思考。 從上述分析我們可看出,呈現(xiàn)運動軌跡最簡單的辦法就是利用復(fù)制對象命令duplicateMovieClip,弄清這個道理,你也能讓你的flash課件中的運動對象顯示出美麗的軌跡! 老虎幾個實例在下篇發(fā)布。
|