C++绑定lua 回调函数的功能

最近新到一家公司开始做一个新项目,准备用最新的3.6的引擎, 当我准备做c++ 调用lua 功能的时候 ,发现和 2.0不一样, 2.0的时候 我把 LUA_FUNCTION 这个类型绑定到lua  然后lua 注册一个回调函数, 就可以在 c++ 中调用lua 了

大概这么一个 函数

void LuaHandleMgr::registerHandle2COnKey( LUA_FUNCTION handle, const std::string& strKey )
{
if ( strKey.empty() )
{
return;
}
m_mHandle.insert( std::make_pair( strKey, handle ) );
}

LUA_FUNCTION LuaHandleMgr::getHandleByKey( const std::string& strKey )
{
mList::const_iterator cit = m_mHandle.find( strKey );
if ( cit != m_mHandle.end() )
{
return cit->second;
}
return 0;
}

不过我在使用 3.6 版本绑定 LUA_FUNCTION 的时候 遇到 lua.h 这个头文件的路径不对 绑定不了 搞不定 , 上网一查才发现 3.0版本以后 cocos 有了新的方法调用lua 函数

这里参考了 下面三篇博客

http://blog.sina.com.cn/s/blog_93add5520101lv02.html
http://www.cocoachina.com/bbs/read.php?tid-293492.html
http://www.cnblogs.com/emyueguang/p/3713684.html

最后整理一下 帮组有需要的朋友

c++ 部分

     __Integer *i = __Integer::create(456);

    BasicScriptData data(this,i);   
    ScriptEvent eve(kCallFuncEvent  , &data); //kCallFuncEvent  
    auto engine = LuaEngine::getInstance();
    LuaEngine::getInstance()->sendEvent(&eve);

lua 部分
ScriptHandlerMgr:getInstance():registerScriptHandler(tolua.cast( xxxxx , “cc.Node”), function , cc.Handler.CALLFUNC)

    xxxxx    代表c++ 中的 类 
    function    代表你要注册的lua的 函数 

然后执行上面c++ 的 部分 就可以 调用lua 了

数据类型的话 使用 __Array __Dictionary __String 一类的 就 可以传大部分的 数据了

不过 需要在 CCLuaEngine.cpp 这个文件里 修改一下 handleCallFuncActionEvent 这个函数 这部分需要读一下源码 不过参考 上面的博客 相信可以修改好的

然后 当需要定义多个回调的时候 就要自己加 类型了, 就是加 kCallFuncEvent 这个
然后写自己的 handleCallFuncActionEvent 函数
比如我定义了一个新的函数 就可以使用 __Array 传递两个数据了

int LuaEngine::handleLogicActionEvent(void* data)
{

if (NULL == data)
    return 0;

BasicScriptData* basicScriptData = static_cast<BasicScriptData*>(data);
if (NULL == basicScriptData->nativeObject)
    return 0;
    
int handler =ScriptHandlerMgr::getInstance()->getObjectHandler(basicScriptData->nativeObject, ScriptHandlerMgr::HandlerType::EVENT_CUSTOM_LOGIC);

if (0 == handler)
    return 0;

__Array* target = static_cast<__Array*>(basicScriptData->value);

if (NULL != target)
{
   // _stack->pushObject(target, "cc.Node"); //cc.Node

    __Integer *u = (__Integer *)target->getObjectAtIndex(0);
    __String  *s = (__String *)target->getObjectAtIndex(1);

    _stack->pushInt(u->getValue());
    
    _stack->pushString(s->getCString());


}
int ret = _stack->executeFunctionByHandler(handler, target ? 2 : 0);
_stack->clean();
return ret;

}

在这个问题上研究了 大半天,可能也是自己能力有限, 抛砖引玉 希望能对有需要的朋友起点作用

最后,要吐槽了 , c++ 调用 lua 的功能 感觉在项目中 用的还是不少的, 2.0 我感觉 还好,不过3.0改成这样,我感觉很麻烦,尤其是第一次使用的时候,
还要改源码部分, 这有点太不友好了,不可能每个开发者都是大神,都能精通引擎啊, 希望官方,能出个 解决方案,把这项功能弄简单点,或者可能是我
没找到别的好方法,版主官方能介绍一个更好的方案,谢谢!!!!

完整一点的 lua的代码 补充一下

           local function  testrr(str,hh)
                 print(" ~~~~~~~~~ cpp  调用 lua testrr "..str.."  "..hh)
           end
           local    testLayer = MySprite:createMS("res/image/conmmon_zhenronganniu.png")
           self:addChild(testLayer)
           ScriptHandlerMgr:getInstance():registerScriptHandler(tolua.cast(testLayer, "cc.Node"), testrr, cc.Handler.EVENT_CUSTOM_LOGIC)