我正在将我的 V1 cocos2d-x 应用程序更新到 V3,但我卡在了回调上。
我可以像这样使用 lambda 进行回调,效果很好 -
auto mcb = CallFunc::create([this](){
this->doCallback(kEVENT_MENU_IS_ONSCREEN);
});
hex->runAction(Sequence::create(somethingthattakestime, mcb, NULL) );
但是,我想将 CallFunc 变量传递给函数,将其存储在我的对象中,然后在将来的某个时间点使用/调用它。
在我定义的类中-
CallFunc * callfunc;
设置一个简单的-
item->callfunc = callfunc;
在函数内 -
void LBMenuAddMenuItemName( CallFunc * callfunc );
我还将 CallFunc 变量声明为静态的,因此它会挂起 -
static auto doSoloPlay = CallFunc::create([this](){
CCLOG("doSoloPlay variable");
this->menuSoloPlay();
});
稍后当我想使用它时,我会 -
Sequence * seq = Sequence::create(callfunc,NULL);
somesprite->runAction(seq);
然而,这以 SIGSEGV (GLThread) 结束。
使用 typeid(callfunc).name() 表明 callfunc 是一个 CallFunc。在声明中使用 setTag(69),然后在 SIGSEGV 之前使用 getTag() 不会返回合理的值。
有人可以解释我做错了什么以及延迟回调的正确方法吗?
谢谢!
磅
最佳答案
尝试了很多东西然后发现当我在声明后执行'retain()'时这个错误消失了-
doSoloPlay->retain();
这会增加引用计数。
我不太清楚我为什么需要这个。我的猜测是 cocos2d-x 类可能会进行一些巧妙的垃圾收集?
关于c++ - cocos2d-x v3 CallFunc 作为参数/变量如何,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40085987/