最近新到一家公司开始做一个新项目,准备用最新的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改成这样,我感觉很麻烦,尤其是第一次使用的时候,
还要改源码部分, 这有点太不友好了,不可能每个开发者都是大神,都能精通引擎啊, 希望官方,能出个 解决方案,把这项功能弄简单点,或者可能是我
没找到别的好方法,版主官方能介绍一个更好的方案,谢谢!!!!