Cocos2d-x人物动作类实例(4)
以下再来介绍一下CCCallFunc家族类的使用方法,它们也是一个动作类,一般用在顺序动作序列中执行的最后一个动作,目的是调用一个函数,来完成一些功
以下再来介绍一下CCCallFunc家族类的使用方法,它们也是一个动作类,一般用在顺序动作序列中执行的最后一个动作,目的是调用一个函数,来完成一些功能。以下是这些类的继承关系。
接下来贴上源代码,注释是对各个类的使用的详细讲解。
bool HelloWorld::init() { bool bRet = false; do { CC_BREAK_IF(! CCLayer::init()); CCSprite * sprite = CCSprite::create("image.png"); sprite->setPosition(ccp(240,160)); this->addChild(sprite,0,0); //创建一个菜单,添加一个run事件 CCMenuItemFont * fontMenu = CCMenuItemFont::create("begin",this,menu_selector(HelloWorld::run)); CCMenu * menu = CCMenu::create(fontMenu,NULL); menu->setPosition(ccp(400,40)); this->addChild(menu); bRet = true; } while (0); return bRet; } void HelloWorld::run(CCObject* pSender) { CCSprite * sprite = (CCSprite *)this->getChildByTag(0); //创建延时动作 CCRotateBy * rotate = CCRotateBy::create(2.0,3*360); //CCCallFunc,为这个动作绑定一个函数,执行这个动作的时候会调用这个函数,创建以下四个动作的时候使用了不同的选择器,但名字和各个动作有关 CCCallFunc * func = CCCallFunc::create(this,callfunc_selector(HelloWorld::show)); //CCCallFuncN(N就是node的意思),与上边不同的是,绑定的函数需要一个参数,这个传入的参数就是执行这个动作的节点 CCCallFuncN * funcN = CCCallFuncN::create(this,callfuncN_selector(HelloWorld::remove)); int num = 10; //CCCallFuncND(D就是data的意思),这次绑定的函数,不仅需要绑定动作的节点作为参数传递,还带了一个void *类型的参数,代表可以是任何类型 CCCallFuncND *funcND = CCCallFuncND::create(this,callfuncND_selector(HelloWorld::showData),(void *)num); CCSprite * sprite2 = CCSprite::create("image2.png"); //CCCallFuncO(O就是object的意思)这次需要传入的参数是CCObject *类型的 CCCallFuncO * funcO = CCCallFuncO::create(this,callfuncO_selector(HelloWorld::showSprite),sprite2); //创建顺序动作序列 //CCSequence * sequence = CCSequence::create(rotate,func,funcND,NULL); //CCSequence * sequence = CCSequence::create(rotate,func,funcN,NULL); CCSequence * sequence = CCSequence::create(rotate,func,funcN,funcO,NULL); sprite->runAction(sequence); } //以下函数不要忘记在头文件中声明,注意每个函数的参数 void HelloWorld::show() { CCLabelTTF * ttf = CCLabelTTF::create("action end","Arial",32); ttf->setPosition(ccp(240,260)); this->addChild(ttf); } void HelloWorld::remove(CCNode * node) { //没有通过getChildByTag()函数获得执行动作的精灵,而是使用remove传来的参数 CCSprite * sprite = (CCSprite *)node; //true表示sprite不仅会移除,而且这个节点上的所有操作和回调都将删除 sprite->removeFromParentAndCleanup(true); //通过以下的方法可以实现相同的效果,只是函数执行的对象不同 //this->removeChild(sprite,true); } void HelloWorld::showData(CCNode * node,void * data) { CCSprite * sprite = (CCSprite *)node; this->removeChild(sprite,true); CCLog("num = %d",data); } void HelloWorld::showSprite(CCObject * sender) { CCSprite * sprite = (CCSprite *)sender; sprite->setPosition(ccp(240,160)); this->addChild(sprite); }
精彩图集
精彩文章