Flash调用Lua脚本: 二

这里有一个具体的例子:http://rc.qzone.qq.com/100641772

在这一节里面,进一步学习使用LuaAlchemy。

和上一节一样,首先建立一个AS3项目.

public class LowevelDemo1 extends Sprite
    {
        public function LowevelDemo1()
        {
            InitPage();
            LoadLua("../luaassets/lowevel.lua");
        }
        
        private function InitPage():void
        {
            var label:Label;
            var btn:Button = new Button();
            btn.move(100, 100);
            addChild(btn);
            var c:MyClass;
        }
        
        private function LoadLua(_url:String):void
        {
            var urlLoader:URLLoader = new URLLoader();
            urlLoader.dataFormat = URLLoaderDataFormat.TEXT;
            var urlRequest:URLRequest = new URLRequest(_url);
            urlLoader.addEventListener(Event.COMPLETE, function(e:Event):void{
                ExecuteLua(urlLoader.data);
            });
            urlLoader.load(urlRequest);
        }
        
        private function ExecuteLua(_luaSt:String):void
        {
            var lua:LuaAlchemy = new LuaAlchemy();
            lua.setGlobal("this", this);
            lua.doString(_luaSt);
        }
    }

这是一个主文件,在这个文件里我们载入了一个Lua脚本。在页面上放了一个按钮。

下面让我们看看Lua脚本。

-- LuaAlchemy 
-- http://code.google.com/p/lua-alchemy/wiki/LuaToAS3LowLevel
--[[
     进一步学习LuaAlchemy,lua脚本的学习
]]--

as3.trace("Lua Demo")
--as3.class.fl.controls.Button.new()
-- btn = as3.new("fl.controls::Button") 这个写法总是出错

function luamethod()
  as3.trace("ok")
end


local lab1 = as3.class.fl.controls.Label.new()
lab1.text = "This is a lua alchemy demo."
lab1.width = 200
this.addChild(lab1)
lab1.move(10,10)
local st1 = as3.new("String","Hello World!")
local v,n = as3.tolua(st1,40)
as3.trace(type(v))
as3.trace(type(n))
as3.trace(type(st1))
local m = as3.toas3(luamethond)
as3.trace(m)
as3.trace(luamethond)
lab1.text = st1

local m1,m2 = as3.toas3(45,function() local m = 100 end)
as3.trace(type(m1))
as3.trace(type(m2))

local m3 = as3.new("Array")
m3[0] = "A"
m3[1] = "b"
local m4 = as3.get(m3,"length")
as3.trace(type(m4))

as3.set(lab1,"text","Change by lua")

as3.trace(as3.type(m3))

local customClass = as3.class.CustomPack.MyClass.new()
as3.trace(as3.type(customClass))
as3.call(customClass.c1,"m1")
local c5 = as3.get(customClass,"p1")
local c6 = as3.tolua(c5)
as3.trace(c5)
as3.trace(c6)

在脚本里面看到了MyClass这个类。

package CustomPack
{
    public class MyClass
    {
        public var p1:int = 100;
        public var c1:MyClass2 = new MyClass2();
        public function MyClass()
        {
        }
        
        public function HelloMethod(_n:int):void
        {
            trace((p1*_n));
        }
    }
}
package CustomPack
{
    public class MyClass2
    {
        public var p1:int = 33;
        public function MyClass2()
        {
        }
        
        public function m1():void
        {
            trace("hello,m1");
        }
    }
}

补充一点,如果想在AS文件中调用Lua文件的函数也很简单,为按钮添加下面的事件代码就可以了。

,btn2.addEventListener(MouseEvent.CLICK, function(e:Event):void
   {
    var result:Array = lua.doString("TempMethod()");
   });

现在,我们不但可以从Lua访问AS里面的方法,而且可以从AS里面访问Lua的方法了。