之前在学习MoonWarriors时就曾经遇到过一些问题,因为当时没注意回调的几种方式,导致编译器报错。今天看了大牛的文章后,恍然大悟。原址为:http://blog.csdn.net/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); }