Luar's Flash Playground:Flash Lite的Call(模擬Function)怎樣傳Parameter和Return Value
Flash Lite的Call(模擬Function)怎樣傳Parameter和Return Value (05-08-2005)
Flash Lite 1.1的Syntax仍然是Flash 4,沒有Function,所以要用Call模擬Function,Call原來是用來執行某一格Frame的ActionScript(以下簡稱:Call Frame),所以沒有傳Parameter和Return Value的能力,不過因為Flash Lite支援Variable Declaration使用Dot Sytnax,所以可以做到傳Parameter和Return Value,更強是達到Call by Value和Call by Reference的分別。

首先,要有一個良好編程習慣,所有這樣的Call Frame,不要在Main Movie Timeline建立,我看到有些人以為將Call Frame放在Main Movie後面,只要不播放到那裡,就沒有所謂,而且同一個Timeline裡,Scope和Movie Clip路徑問題又簡單些。

正確應該是為每一個Function,獨立建立一個Movie Clip(以下簡稱:CallMC),或者用OO思考,同一個Movie Clip有很多Call Frame,當作是Object的Method。這樣傳入來Parameter不會污染Main Movie,而且封裝好一點,可以容易地將整個Movie Clip複製到另一個FLA中使用,提高Reusability。

第二,建立的Movie Clip,Frame 1一定要加Stop,Frame 2才是程式碼和Frame Label,這樣避免Movie Clip放在Main Movie Timeline時,立即執行了你的程式碼。

以下是一個簡單的加數Function例子:

Call by Value

Movie Clip名稱funcByValue, Frame 2, Label Name: addNo
ret = par1+par2;
使用方法:利用Dot Sytnax先在Movie Clip funcByValue裡建立兩個Variable par1, par2,這變相達到傳Parameter的能力,程式執行完後,Movie Clip funcByValue裡建立一個Variable叫ret,外面只要讀取它,變相達到Return Value的效果:
myNo1 = 10;
myNo2 = 5;
funcByValue.par1 = myNo1;
funcByValue.par2 = myNo2;
call("funcByValue:addno");
myNo3 = funcByValue.ret;
trace("function call by value");
trace("myno1: " add myno1); //10
trace("myno2: " add myno2); //5
trace("myno3: " add myno3); //15
Call by Reference

eval()是Flash Lite裡非常有用的利器,Array, Movie Clip Dynamic Naming(即Array Access operator [])等都是靠它才達成,而且它不像Flash 5後eval()不可放在=的左邊,因此可以發揮到很大效能。剛才例子,改為Call by Reference,CallMC的Call Frame變成:
eval("../:" add par1) = eval("../:" add par1)*10;
eval("../:" add par2) = eval("../:" add par2)*10;
eval("../:" add ret) = eval("../:" add par1)+eval("../:" add par2);
使用方法:利用Dot Sytnax先在Movie Clip funcByRef裡建立Variable名稱的Variable,用eval()達到Reference的效果:
myNo4 = 1;
myNo5 = 2;
myNo6 = 3;
trace("before function call by reference");
trace("myno4: " add myno4); //1
trace("myno5: " add myno5); //2
trace("myno6: " add myno6); //3
funcByRef.par1 = "myNo4";
funcByRef.par2 = "myNo5";
funcByRef.ret = "myNo6";
call("funcByRef:addno");
trace("after function call by reference");
trace("myno4: " add myno4); //10
trace("myno5: " add myno5); //20
trace("myno6: " add myno6); //30
下載範例

本文章由發表。
同組文章