這里有一個具體的例子:http://rc.qzone.qq.com/100641772
這次我們建一個累加的Demo。在前面,我們已經了解了Lua和AS3的通信,但還有很多,比如在AS3里面讀取Lua方法的返回值,這時候返回的是一個第一個元素為布爾值的Array。但我卻不知道怎么樣從這個Array中讀取需要的結果。如果有哪個朋友了解這個,希望能夠解答一下。
在這里面,建立了一個類作為Lua和AS3之間數據通信的中介,
1 package Middle 2 { 3 public class MiddleData 4 { 5 public static var DataArray:Array = new Array(); 6 public function MiddleData() 7 { 8 } 9 10 public function Add(_n:int):void 11 { 12 DataArray.push(_n); 13 } 14 } 15 }
這個類實際上沒有做什么事情,只是有一個靜態屬性作為數據存儲。
在Lua文件中,我們做了3件事情,1)建立一個累加的函數 2)建立上面AS3里面建立的數據中介類 3)調用這個類的Add方法,把Lua的累加函數產生的結果放到這個數據中介類的靜態屬性里。
1 function fact(num) 2 if(num <= 1) then 3 return 1 4 else 5 return num + fact(num -1) 6 end 7 end 8 9 local v = as3.class.Middle.MiddleData.new() 10 11 function exe_fact(num) 12 --as3.trace(fact(num)) 13 as3.call(v,"Add",fact(num)) 14 end
再接下來的事情,就相對容易了,建立AS3的項目,在這里面調用Lua的方法,然后調用數據中介類,從里面取得Lua方法的返回值。
1 public class StudyLua01 extends Sprite 2 { 3 public var IntArray:Vector.<int> = new Vector.<int>(); 4 private var txtInput:TextInput; 5 private var btn:Button; 6 private var lbl:Label; 7 public function StudyLua01() 8 { 9 InitPage(); 10 LoadLua("../lualib/lua1.lua"); 11 } 12 13 private function InitPage():void 14 { 15 txtInput = new TextInput(); 16 txtInput.move(10, 10); 17 addChild(txtInput); 18 btn = new Button(); 19 addChild(btn); 20 btn.move(180, 10); 21 lbl = new Label(); 22 lbl.move(380, 10); 23 lbl.text = "0"; 24 addChild(lbl); 25 } 26 27 private function LoadLua(_url:String):void 28 { 29 var urlLoader:URLLoader = new URLLoader(); 30 urlLoader.dataFormat = URLLoaderDataFormat.TEXT; 31 var urlRequest:URLRequest = new URLRequest(_url); 32 urlLoader.addEventListener(Event.COMPLETE, function(e:Event):void{ 33 ExecuteLua(urlLoader.data); 34 }); 35 urlLoader.load(urlRequest); 36 } 37 38 private function ExecuteLua(_luaSt:String):void 39 { 40 var lua:LuaAlchemy = new LuaAlchemy(); 41 lua.setGlobal("this", this); 42 lua.doString(_luaSt); 43 44 btn.addEventListener(MouseEvent.CLICK, function(e:Event):void 45 { 46 var ar:Array = lua.doString("exe_fact(" + txtInput.text + ")"); 47 var result:int = MiddleData.DataArray.pop(); 48 lbl.text = result.toString(); 49 }); 50 } 51 }
來簡單展現一下效果:

