在线游戏脚本编程 --- Flash调用Lua脚本 三
这里有一个具体的例子: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):void11 {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():void14 {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):void28 {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):void39 {40 var lua:LuaAlchemy = new LuaAlchemy();41 lua.setGlobal("this", this);42 lua.doString(_luaSt);43 44 btn.addEventListener(MouseEvent.CLICK, function(e:Event):void45 {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 }