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;
Call by ReferencemyNo2 = 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 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;
使用方法:利用Dot Sytnax先在Movie Clip funcByRef裡建立Variable名稱的Variable,用eval()達到Reference的效果:eval("../:" add par2) = eval("../:" add par2)*10; eval("../:" add ret) = eval("../:" add par1)+eval("../:" add par2); 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 |
|
本文章由發表。 |
同組文章 |