quick 3.3 C++回调lua方法

以前在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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值