以前在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);