Cocos2d-x:scheduleOnce落坑与CCCallFunc的使用

【Problom】事情的起因是这样子的,我在一个函数中使用了scheduleOnce延时一秒调用callBack,如下:

this->scheduleOnce(schedule_selector(HelloWorld::callBack), 1.0);

函数callBack实现如下:

void HelloWorld::callBack(float dt) 
{
    this->scheduleOnce(schedule_selector(HelloWorld::callBack), 0.5);
}

执行到callBack内时scheduleOnce并没有成功,输出如下:

CCScheduler#scheduleSelector. Selector already scheduled. Updating interval from: 0.0000 to 0.0000

原因是当前的scheduleOnce还没有执行完成。


【Solution】这种问题的解决办法就是把CCDelayTime和CCCallFunc拼接构造延迟事件调用,用法如下:

CCDelayTime * delayAction = CCDelayTime::create(dt);
CCCallFunc * callFunc = CCCallFunc::create(pSelectorTarget, selector);
this->runAction(CCSequence::createWithTwoActions(delayAction, callFunc));

【Note】

CCCallFunc家族四兄弟都用来创建带有回调函数的动作,区别主要在于回调函数的参数:

CCCallFunc * CCCallFunc::create(CCObject* pSelectorTarget,SEL_CallFunc selector); 
CCCallFuncN * CCCallFuncN::create(CCObject* pSelectorTarget,SEL_CallFuncN selector); 
CCCallFuncND * CCCallFuncND::create(CCObject* pSelectorTarget,SEL_CallFuncND selector, void* d); 
CCCallFuncO * CCCallFuncO::create(CCObject* pSelectorTarget, SEL_CallFuncO selector, CCObject* pObject)
这四个类分别对应的是四种不同的 回调函数函数包装:

typedef void (SelectorProtocol::*SEL_CallFunc)(); 
typedef void (SelectorProtocol::*SEL_CallFuncN)(CCNode*);		//接受一个动作的执行节点做参数
typedef void (SelectorProtocol::*SEL_CallFuncND)(CCNode*, void*); 	//接受动作的执行节点做参数和一个void指针做参数
typedef void (SelectorProtocol::*SEL_CallFuncO)(CCObject*); 		//接受一个Object指针做参数


例子如下:

void Test::func(); 
void Test::funcN(CCNode *node);
void Test::funcND(CCNode *node,void *param);
void Test::funcO(CCObject* obj);
...

CCAction *a1=CCCallFunc::create(this, callfunc_selector(Test::func)); 
this->runAction(a1); 
 
CCAction *a2=CCCallFuncN::create(this, callfuncN_selector(Test::funcN)); 
this->runAction(a2); 
 
int i; 
CCAction *a3=CCCallFuncND::create(this, callfuncND_selector(Test::funcND),(void*)&i); 
this->runAction(a3); 
 
CCObject *obj; 
CCAction *a4=CCCallFuncO::create(this, callfuncO_selector(Test::funcO),obj); 
this->runAction(a4); 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值