http://cn.cocos2d-x.org/tutorial/show?id=1896
思路
像所有语言一样,绑定回调主要是执行的任务执行到特定情形的时候,调用对用回调方法。 本文也一样,Lua注册回调到C++的核心思路是,当C代码执行到特定特定情形的时候,调用Lua的方法。
我这里使用的是用lua_stack直接调用lua的方法,没有使用Cocos2d-x封装的那个dispatcher,因为熟悉那个格式太墨迹了。
主要步骤如下
-
C代码绑定回调,调用Lua函数
1
3
5
7
9
11
13
15
17
19
21
23
25
27
29
31
ArmatureNode::registerMovementEventHandler(
handler)
{
//移除之前注册的监听
//缓存lua函数的引用 这个后边说
auto f = [
](cocos2d::EventCustom *event)
{
auto type = (
) eventData->getType();
auto lastState = eventData->armature->getAnimation()->getLastAnimationState();
stack->pushObject(
,
);
stack->pushString(movementId.c_str(), movementId.size());
stack->executeFunctionByHandler(_movementHandler, 3);
dispatcher->addCustomEventListener(dragonBones::EventData::COMPLETE, f);
}
void
void
if
{
//移除lua函数的绑定
}
}
- 2468101214161820
tolua_db_DBCCArmature_registerMovementEventHandler(lua_State* tolua_S)
{(NULL == tolua_S)
0;
argc = 0;
self =
<dragonBones::ArmatureNode*>(tolua_tousertype(tolua_S,1,0));
argc = lua_gettop(tolua_S) - 1;
(1 == argc)
//第二个参数,就是Lua里的function 这里要通过toluafix_ref_function这个函数映射成一个Int值
handler = (toluafix_ref_function(tolua_S,2,0));
return
}
0;
}- 2468101214int
lua_pushstring(tolua_S,
);
lua_rawget(tolua_S, LUA_REGISTRYINDEX);
(lua_istable(tolua_S,-1))
lua_pushstring(tolua_S,
);
lua_rawset(tolua_S,-3);
lua_pop(tolua_S, 1);
0;
}- 2468
"Dragon"
local animation = arm:getAnimation()
"walk"
arm:registerMovementEventHandler(
print(...)
)
-测试
打印回调输出,测试通过 userdata 8 walk
其他
<ul list-paddingleft-2"="" style="word-wrap: break-word;">246810121416182022int
int
int
if
return
s_function_ref_id++;
lua_pushstring(L, TOLUA_REFID_FUNCTION_MAPPING);
lua_rawget(L, LUA_REGISTRYINDEX);
lua_pushinteger(L, s_function_ref_id);
lua_pushvalue(L, lo);
lua_rawset(L, -3);
lua_pop(L, 1);
s_function_ref_id;
}TOLUA_APItoluafix_get_function_by_refid(lua_State* L,
refid)
{//存放luafunction 映射table 的key压栈
//获取方法映射表,放在栈顶
//function_id压栈
//获取到的luafunction 放到栈顶
//
}-
executeFunctionByHandler
executeFunctionByHandler 这个方法只是通过toluafix_get_function_by_refid 获取到function然后通过lua_pcall 方法调用,代码就不写了。