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):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     }

来简单展现一下效果:

 
posted @ 2012-07-22 14:15  向恺然  阅读(3276)  评论(1编辑  收藏  举报

我必须说的是:我崇尚开源,但鄙视剽窃。本博客所有引用的图片,文章,和代码,均只作为研究学习使用,不作为商业应用。如果我无意中冒犯了您,请发消息留言,我将立即删除。