cocos2d-lua绑定C++自定义类(自动+手动绑定回调函数)
cocos2d-lua绑定C++自定义类(自动+手动绑定回调函数)
Valiancer 发表于4个月前
cocos2d-lua绑定C++自定义类(自动+手动绑定回调函数)
  • 发表于 4个月前
  • 阅读 16
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

1.自定义C++类

将文件保存在frameworks/runtime-src/Classes/目录下,然后编写对应的.ini文件(在frameworks/cocos2d-x/tools/tolua/目录),然后修改genbindings.py(同目录)文件141行附近,将修改的ini文件加进去,可以把其他的注释掉。然后再cmd到当前文件夹,中执行genbindings.py脚本:python genbindings.py,会在cocos/scripting/lua-bindings/auto中生成文件,按照步骤2加入到工程对应的auto目录下,然后在AppDelegate.cpp文件中添加相关头文件和注册register_custom_function(stack->getLuaState())

2.添加到xcode

添加文件到对应的项目工程下,如图:

不要忘了勾选平台

添加搜索路径:

$(SRCROOT)/../../../../../runtime-src/Classes

3.添加到vs

$(EngineRoot)..\runtime-src\Classes

 

上边是自动绑定,lua调用c++

但是自动绑定不支持lambda,回调函数需要手动绑定

1.声明lua函数ID

​int _handlerID;


//注册lua回调函数,需lua主动调用
void XXX::registerScriptTouchHandler(int onTouchHandler)
{
	_handlerID = onTouchHandler;

	_handlerTouch = std::bind(&RichElementTextEx::handlerTouch, this, std::placeholders::_1);
}

​//C++回调函数,在其中调用lua回调函数并填入相应参数
void XXX::handlerTouch(const string& name)
{
	LuaStack* stack = LuaEngine::getInstance()->getLuaStack();

	stack->pushString(name.c_str());

	stack->executeFunctionByHandler(_handlerID, 1);
	stack->clean();
}

2.修改自动绑定生成的cpp文件

找到注册函数 lua_XXX_registerScriptTouchHandler(lua_State* tolua_S),将其中的

ok &= luaval_to_int32(tolua_S, 2,(int *)&arg0, "RichElementTextEx:registerScriptTouchHandler");
if(!ok)
{
    ...
    return 0;
}

改为

arg0 = toluafix_ref_function(tolua_S, 2, 0);
//toluafix_get_function_by_refid(tolua_S, arg0);

3.lua调用

local val = xxx:create();
val:registerScriptTouchHandler(function(name)
                                   ...
                               end);

 

共有 人打赏支持
粉丝 0
博文 12
码字总数 2176
×
Valiancer
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: