之前在学习MoonWarriors时就曾经遇到过一些问题,因为当时没注意回调的几种方式,导致编译器报错。今天看了大牛的文章后,恍然大悟。原址为:http://blog.youkuaiyun.com/onerain88/article/details/7437944,记录下来以免以后遇到再次遇到。
动作一般支持3种回调方式
(1).无发送者无数据回调:CCCallFunc,回调函数无参数。示例如下
void HelloWorld::actionCallback()
{
CCSize winSize = CCDirector::sharedDirector()->getWinSize();
CCLabelTTF *label = CCLabelTTF::labelWithString("Action Callback!", "Marker Felt", 32);
label->setPosition(ccp(winSize.width / 2, winSize.height / 2));
this->addChild(label);
}
(2).有发送者无数据回调:CCCallFuncN (N是CCNode),有一个参数为发送者信息,示例如下
void HelloWorld::actionCallbackN(CCNode *pSender)
{
CCSprite *sprite = (CCSprite *) pSender;
// 回调变红色
sprite->setColor(ccRED);
}
(3).有发送者有数据回调:CCCallFuncND (N是CCNode,D是data,是void *类型),有两个参数,一个味发送者信息 ,另一个参数为附带数据。
void HelloWorld::actionCallbackND(CCNode *pSender, void *data)
{
CCSize winSize = CCDirector::sharedDirector()->getWinSize();
CCSprite *sprite = (CCSprite *) pSender;
// 回调变蓝色
sprite->setColor(ccBLUE);
// 接收回调数据
CCLabelTTF *label = CCLabelTTF::labelWithString((char *) data, "Marker Felt", 32);
label->setPosition(ccp(winSize.width / 2, winSize.height / 2));
this->addChild(label);
CCLog((char *) data);
}
使用实例如下:
void HelloWorld::actionListen()
{
CCSize winSize = CCDirector::sharedDirector()->getWinSize();
CCFiniteTimeAction *action = CCSequence::actions(
CCMoveBy::actionWithDuration(2.0f, CCPointMake(winSize.width / 2, 0)),
CCCallFunc::actionWithTarget(this, callfunc_selector(HelloWorld::actionCallback)), NULL);
CCFiniteTimeAction *actionN = CCSequence::actions(
CCMoveBy::actionWithDuration(2.0f, CCPointMake(-winSize.width / 2, 0)),
CCCallFuncN::actionWithTarget(this, callfuncN_selector(HelloWorld::actionCallbackN)), NULL);
CCFiniteTimeAction *actionND = CCSequence::actions(
CCMoveBy::actionWithDuration(2.0f, CCPointMake(winSize.width / 2, 0)),
CCCallFuncND::actionWithTarget(this, callfuncND_selector(HelloWorld::actionCallbackND), (void *) "Callback Data"), NULL);
oldManSprite->runAction(actionND);
youngSisterSprite->runAction(actionN);
}