lua - 熱更新模塊

最近準備在手機項目客戶端中使用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
發佈了116 篇原創文章 · 獲贊 26 · 訪問量 24萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章