quick 3.3 C++回调lua方法

来源:互联网 发布:黑色时间轴源码下载 编辑:程序博客网 时间:2024/05/17 00:48

以前在quick 2.x的时候直接用LUA_FUNCTION,然后弄一个.tolua文件直接生成,就可以传入lua fucntion保存,然后用c++调用。

虽然3.3也可以使用这个方法,但是没有tolua文件的地方了,剩下的是各种.ini和genbindings.py来生成tolua cpp文件。


一个简单的例子

cpp文件

void MyClass::foo(std::function<void(int aa, int bb, int cc, int dd)> listener, int a, int b, int c, int d){    listener(a, b, c, d);}

tolua文件

int lua_MyClass_MyClass_foo(lua_State* tolua_S){    int argc = 0;    MyClass* cobj = nullptr;    bool ok  = true;#if COCOS2D_DEBUG >= 1    tolua_Error tolua_err;#endif#if COCOS2D_DEBUG >= 1    if (!tolua_isusertype(tolua_S,1,"MyClass",0,&tolua_err) ||        !toluafix_isfunction(tolua_S,2,"LUA_FUNCTION",0,&tolua_err)) goto tolua_lerror;#endif    cobj = (MyClass*)tolua_tousertype(tolua_S,1,0);#if COCOS2D_DEBUG >= 1    if (!cobj)     {        tolua_error(tolua_S,"invalid 'cobj' in function 'lua_MyClass_MyClass_foo'", nullptr);        return 0;    }#endif    argc = lua_gettop(tolua_S)-1;    if (argc == 5)     {                int arg0;        int arg1;        int arg2;        int arg3;        int arg4;        arg0 = toluafix_ref_function(tolua_S,2,0);        ok &= luaval_to_int32(tolua_S, 3,(int *)&arg1, "MyClass:foo");        ok &= luaval_to_int32(tolua_S, 4,(int *)&arg2, "MyClass:foo");        ok &= luaval_to_int32(tolua_S, 5,(int *)&arg3, "MyClass:foo");        ok &= luaval_to_int32(tolua_S, 6,(int *)&arg4, "MyClass:foo");        if(!ok)        {            tolua_error(tolua_S,"invalid arguments in function 'lua_MyClass_MyClass_foo'", nullptr);            return 0;        }        cobj->foo([=](int aa, int bb, int cc, int dd){            LuaStack *stack = LuaEngine::getInstance()->getLuaStack();            stack->pushInt(aa);            stack->pushInt(bb);            stack->pushInt(cc);            stack->pushInt(dd);            stack->executeFunctionByHandler(arg0, 4);            stack->removeScriptHandler(arg0);        }, arg1, arg2, arg3, arg4);        return 0;    }    luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "MyClass:foo",argc, 5);    return 0;#if COCOS2D_DEBUG >= 1    tolua_lerror:    tolua_error(tolua_S,"#ferror in function 'lua_MyClass_MyClass_foo'.",&tolua_err);#endif    return 0;}

lua调用c++


function toluaTest(bb, cc, dd, ee)     print('====', bb, cc, dd,ee) end   local myClass = MyClass:create(); myClass:foo(toluaTest,1,2,3,4);


0 0
原创粉丝点击