在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
思路像所有语言一样,绑定回调主要是执行的任务执行到特定情形的时候,调用对用回调方法。 这里也一样。核心思路是,当c代码执行到特定特定情形的时候,调用lua的方法 我这里使用的是用lua_stack直接调用lua的方法,没有使用cocos2dx封装的那个dispatcher,因为熟悉那个格式太墨迹了 主要步骤如下
实现
void ArmatureNode::registerMovementEventHandler(int handler) { unregisterMovementEventHandler(); //移除之前注册的监听 _movementHandler = handler; //缓存lua函数的引用 这个后边说 auto dispatcher = getCCEventDispatcher(); auto f = [this](cocos2d::EventCustom *event) //注册c代码形式的回调 这里用function做 { auto eventData = (dragonBones::EventData*)(event->getUserData()); auto type = (int) eventData->getType(); auto movementId = eventData->animationState->name; auto lastState = eventData->armature->getAnimation()->getLastAnimationState(); auto stack = cocos2d::LuaEngine::getInstance()->getLuaStack(); stack->pushObject(this, "db.ArmatureNode"); stack->pushInt(type); stack->pushString(movementId.c_str(), movementId.size()); //通过LuaStack调用lua里的函数 最后一个参数设置参数个数 stack->executeFunctionByHandler(_movementHandler, 3); }; dispatcher->addCustomEventListener(dragonBones::EventData::COMPLETE, f); } void ArmatureNode::unregisterMovementEventHandler(void) { if (0 != _movementHandler) { cocos2d::LuaEngine::getInstance()->removeScriptHandler(_movementHandler); //移除lua函数的绑定 _movementHandler = 0; } }
上边的这个函数直接用cocos里的genbinding.py 是无法正确生成lua里可调用的接口的,需要手动编写绑定方法 说这个得用到cocos2dx中提供的一个方法 toluafix_ref_function 会把一个lua栈中的方法转成一个int,以便c++中调用。我会在最后面说这个 int tolua_db_DBCCArmature_registerMovementEventHandler(lua_State* tolua_S) { if (NULL == tolua_S) return 0; int argc = 0; dragonBones::ArmatureNode* self = nullptr; self = static_cast<dragonBones::ArmatureNode*>(tolua_tousertype(tolua_S,1,0)); //第一个参数 就是lua里的self argc = lua_gettop(tolua_S) - 1; if (1 == argc) { //第二个参数,就是lua里的function 这里要通过toluafix_ref_function这个函数映射成一个Int值 int handler = (toluafix_ref_function(tolua_S,2,0)); self->registerMovementEventHandler(handler); return 0; } return 0; }
local arm = db.ArmatureNode:create("Dragon") local animation = arm:getAnimation() animation:gotoAndPlay("walk") arm:registerMovementEventHandler( function(...) print(...) end ) -测试 打印回调输出,测试通过 -------------------------------------------------- 其他
这两个方法是相互对应的 toluafix_ref_function这个方法在注册表上将一个lua的function与一个function_id生成映射 toluafix_get_function_by_refid 方法可以通过前一个方法生成的function_id来讲绑定的lua function放到栈顶
|
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论