现在的位置: 首页 > 综合 > 正文

使用LUA 热更新模块

2019年08月23日 ⁄ 综合 ⁄ 共 1722字 ⁄ 字号 评论关闭

最近准备在手机项目客户端中使用lua, 以前一直在服务器使用luabind. 另外, tolua++也体验过, LuaPlus也在早年用过. 以下是本人对这些绑定库的个人感觉:

luabind

利用boost机制把绑定做到极致, 比较适合主c++, 弱lua的脚本框架.

作者已经停止更新, 在windows/linux编译没问题, 但是在ios的LLVM下, 无法编译

tolua++

像cocos2dx使用tolua++也是可以理解的, 那么多函数需要绑定, tolua++的头文件parse及自动代码生成节约了很多手动绑定的时间.

但是看到代码中有一部分bugfix就心存不安(纯个人感觉, 本人使用不多, 欢迎砖头伺候),另外, tolua++只能由脚本层驱动C++, 而没有将已经实例化的句柄注册到lua的功能也是煞笔啊

 

LuaPlus

接口较为简单, 适于初学者上手, 无任何的模板, 性能不高

 

luaBridge

项目地址: https://github.com/vinniefalco/LuaBridge

手册: http://vinniefalco.com/LuaBridge/Manual.html

纯头文件实现, 无需编译, 包含进入工程即可, 接口简洁高效

相比luabind, 唯一不能实现的常用功能就是枚举, 但是可以支持类成员静态变量注册, 这个就无所谓了, 手写一个枚举支持也很简单

看下演示代码:

class A
{
public:
    A( )
    {

    }
    virtual void foo( int a )
    {
        printf("foo base\n");
    }

    std::string Member;
};

class B : public A
{
public:
    virtual void foo( int a )
    {
        printf("foo inherited\n");
    }
};
void foo( int b )
{

}

luabridge::getGlobalNamespace(L)
        .beginClass<A>("Sobj")
            .addConstructor<void (*) (void)> ()
            .addFunction("foo", &A::foo)
            .addData("Member",&A::Member)
        .endClass()
        .deriveClass<B, A>("SSec")
            .addFunction("foo",&B::foo )
        .endClass();

    luabridge::getGlobalNamespace(L).addFunction("foo", foo );


    B ins;
    ins.Member = "data";
    luabridge::setGlobal(L, ins, "ins");

lua侧的代码

local a = Sobj()
a:foo(2)
a.Member = "hello"
ins:foo(3)


应用在COCOS2DX中的部分测试部分:
直接解压,把LuaBridge.h,RefCountedObject.h,RefCountedPtr.h和detail下的所有头文件,全部复制到classes目录,然后在AppDelegate包含luabrigde.h就可以了。
下面是一个用于测试的类
class testA
{ public:     testA()     {     }     int getValue()     {         return 100;     } };
下面是绑定代码
    luabridge::getGlobalNamespace(pEngine->getLuaStack()->getLuaState())         .beginClass<testA>("testA")         .addConstructor<void(*) ()>()         .addFunction("getValue", &testA::getValue)         .endClass();
然后,就可以在你的lua代码使用这个类了。
    local testa = testA ()     cclog("testa=%d", testa:getValue()) 
现在cocos2dx上面,现在出现了两个重要的lua分支, 一个是quickx,一个cocos-code-ide。

抱歉!评论已关闭.