今天整整折腾了一天,终于解决这个问题了,在此把方法说出来,方便大家使用,也给自己留个文字备份。
1,先说说坑爹的底层。。\quick-cocos2d-x-master\lib\luabinding\CocoStudio\CCActionObject.cpp 文件
这个BUG是C++层面遗留的BUG,一直就没改过来。
要用到动画播放结束回调,就必须使用下面这个方法:
void ActionObject::play(CCCallFunc* func)
{
this->play();
this->m_CallBack = func;
}
表面上看起来没什么问题,但是坑爹的地方出现了,就在最后一句传进来的 func 没有retain。导致动画播放结束的时候,这个指针就失效了。。
修改方法:
void ActionObject::play(CCCallFunc* func)
{
this->play();
this->m_CallBack = func;
if (m_CallBack)
{
this->m_CallBack->retain();
}
}
然后在这个cpp文件里,还有其他地方同样存在着类似问题,也一起都改了吧:
在 void ActionObject::stop() 方法最后也得加上
if (m_CallBack)
{
CC_SAFE_RELEASE_NULL(m_CallBack);
}
修改void ActionObject::simulationActionUpdate(float dt):
原代码片段为:
if (isEnd)
{
if (m_CallBack != NULL)
{
m_CallBack->execute();
}
if (m_loop)
{
this->play();
}
}
修改为:
if (isEnd)
{
if (m_CallBack != NULL)
{
m_CallBack->execute();
if (m_CallBack)
{
CC_SAFE_RELEASE_NULL(m_CallBack);
}
}
if (m_loop)
{
this->play();
}
}
2,底层的坑改完了,再来说说tolua转换时的坑吧。。
首先找到 \quick-cocos2d-x-master\lib\luabinding\CocoStudio\ActionObject.tolua 文件
在这里把 void play(CCCallFunc* func); 这个方法加上就可以了。。
然后按照网上的说明。执行一次\quick-cocos2d-x-master\lib\luabinding\build.bat ,然后再编译就OK了。。但是,坑来了。。按照这个做,是怎么也不行的。为什么呢。。
仔细看\quick-cocos2d-x-master\lib\luabinding\目录下的几个文件,发现人家几个都是成对的,只有build.bat在耍单:
basic.lua 和 basic_ccs.lua 是一对,build.sh 和 build_ccs.sh 是一对,Cocos2d.tolua 和 CocoStudio.tolua 是一对。。。就甩了 build.bat自己。。
如果不是发现了这个规律。我是怎么也猜不到这里面应该还有一个build_ccs.bat的。。
没办法,只能自己做了,文件内容这么写就行了:
@echo off
set DIR=%~dp0
set TOLUA=QUICK_COCOS2DX_ROOT\bin\win32\tolua++.exe
cd /d “DIR”
TOLUA -L “%DIR%basic_ccs.lua” -o “QUICK_COCOS2DX_ROOT\lib\cocos2d-x\scripting\lua\cocos2dx_support\LuaCocoStudio.cpp” CocoStudio.tolua
3,注意执行完了build_ccs.bat以后,一定要去VS里编译一下。
然后在lua代码里把ui编辑器的动画加上。以下是我的示例:
function MainScene:onEnter()
self._widget = GUIReader:shareReader():widgetFromJsonFile(“ui/ui_logo.ExportJson”)
self:addChild(self._widget)
self.actObj = ActionManager:shareManager():getActionByName(“ui_logo.ExportJson”, “ui_action_name”)
local fn = cc.CallFunc:create(handler(self,self.callback))
self.actObj:play(fn)
end
function MainScene.callback()
print(“Action end…”)
end
如果是用VS开发的朋友,那此时就大功告成了。
用sublime开发的朋友要注意。sublime调用的是\quick-cocos2d-x-master\player\win\player.exe 不是咱们刚才编译出来的。你的把\quick-cocos2d-x-master\player\proj.win32\Debug\player.exe挪过来,或者修改QuickXDev的启动文件路径也行。
最后,希望我写的这堆废话能帮到大家。
顶