cocos2d-x v3 CallFunc作为参数/变量如何

时间:2016-10-17 12:06:59

标签: c++ callback cocos2d-x

我正在将我的V1 cocos2d-x应用更新为V3,而我却停留在回调上。

我可以用这样的lambdas回电,工作正常 -

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()不返回合理的值。

有人可以解释我做错了什么以及延迟回调的正确方法吗?

谢谢!

LB

2 个答案:

答案 0 :(得分:0)

尝试了很多事情然后发现当我在声明后执行'retain()'时这个错误消失了 -

doSoloPlay->retain();

这会增加引用次数。

我不知道为什么我需要这个。我的猜测是cocos2d-x类可以做一些聪明的垃圾收集吗?

答案 1 :(得分:0)

如果稍后将该函数作为回调调用,则需要在保存时保留回调并在适当的时间释放它。

静态声明只保存CCCallFunc的地址,但是在您希望执行它之前,类已被销毁。