原文地址:http://www.luotao2008.cn/kejianjiaocheng/kj (24).html
老虎注:照該文去作,效果出不來。但該文提出了“呈現(xiàn)運動軌跡”的思路和方法,這對初學(xué)動作腳本的我來說,簡直就是指路明燈。按該思路和方法,自己可以試著去作:圓、橢圓、正弦曲線、拋物線及其他曲線等。
Flash有著豐富的腳本命令(ActionScript),flash課件制作者可以通過編制程序的方法來控制對象的運動或?qū)傩裕赃_到最佳的演示效果。在許多教學(xué)flash課件(尤其是物理flash課件)中,經(jīng)常需要將對象運動的軌跡呈現(xiàn)出來,這是怎樣實現(xiàn)的呢?
也許有些讀者會說:這不容易嗎?使用運動向?qū)?,?fù)制向?qū)Ь€到另一圖層不就成了?!NO!NO!,我要強調(diào)指出,用向?qū)哟_實也可以實現(xiàn)運動效果或顯示運動路線,但這種方法做出的是初級動畫,充其量是Flash的初級運用,它不能實現(xiàn)flash課件的高級交互效果!設(shè)想一個物體做隨機的拋體運動,你能用向?qū)邮箤ο笤谶\動時同時顯現(xiàn)軌跡嗎?答案是否定的。因此,筆者將在本文向大家介紹使用FlashActionScript來實現(xiàn)對象的運動并顯示運動軌跡的方法,這是Flash課件制作的一個重要技巧之一。
也許我們可用VB或VC輕易繪出各類曲線、軌跡,但在Flash中顯現(xiàn)運動軌跡卻顯得有點復(fù)雜,因為Flash5.0以下版本不支持畫線功能,如果希望運動對象在運動時同時顯現(xiàn)軌跡,那我們只好選取一個折中方案:復(fù)制對象!
Flash有一個復(fù)制對象命令:duplicateMovieClip,此命令可以復(fù)制影片剪輯(MovieClip)對象,是flash課件制作的重要命令。我們先來認識這個命令,該命令的語法是:
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)繪制一個填充色為漸進色的小球,再用箭頭工具(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進行同步復(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)是用于強制n為數(shù)值而不是字符,這點很重要,否則flash可能會把n視為字符而將其當(dāng)成字符串來連接,不能實現(xiàn)遞加。不過讀者也會發(fā)現(xiàn),這些密集的復(fù)制對象嚴(yán)重影響了flash課件的效果,而且變量t的累進值越小,復(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ù)制對象
}//強制復(fù)制對象只在旋轉(zhuǎn)不到一周時發(fā)生
第二關(guān)鍵幀:
gotoAndplay(1);
再測試一次看看,沒事了吧!原來我們在代碼中加入了條件語句,這樣不僅可定時(t累加到0.5時)復(fù)制對象,而且只能讓復(fù)制對象指令在小球運動不足一周時(t=6.28即為一周)進行,這樣就解決了前面代碼存在的問題。你看過閃光照相嗎?這種顯現(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ā)布。
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請
點擊舉報。