这里有一个具体的例子: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 }