1、 Cocos2d-x 之 CCCallFunC 家族CCCallFunC 家族当我们需要在一个动作序列中某一个动作执行结束之后,调用某个函数用于执行一个任务的时候,我们可以使用CCCallFunC 家族函数。CCCallFunC 是 CCActionInstant 类的子类。值得注意的是,虽然 CCCallFunC 家族函数是瞬时动作函数的子类,但是所谓的瞬时,也只是指函数调用的一瞬间,而关于函数内部怎么执行,耗用多久,则完全与瞬时没有任何关系。CCCallFunC 家族函数可以将函数调用的过程封装成一个动作类,从而放入动作序列中以供我们调用。HelloWorldScene.h 如下:1234
2、56789#include “cocos2d.h“class HelloWorld : public cocos2d:CCLayerColorpublic:/ Method init in cocos2d-x returns bool, instead of id in cocos2d-iphone (an object pointer)virtual bool init();/ theres no id in cpp, so we recommend to return the class instance pointer101112131415161718static cocos2d:CC
3、Scene* scene();/先声明四个动作的回调方发void callBack();void callNodeBack(CCNode* sender);void callNodeBack(cocos2d:CCNode *sender, void * data);void callObjectBack( CCObject * data);/ preprocessor macro for “static create()“ constructor ( node() deprecated )CREATE_FUNC(HelloWorld);#endif / _HELLOWORLD_SCENE_H_
4、HelloWorldScene.cpp 文件中的boolHelloWorld:init()函数中加入如下代码:1234567891011if ( !CCLayerColor:initWithColor(ccc4(255, 255, 255, 255) )return false;/CCCallFunc 家族函数:当我们需要在一个动作完成之后需要调用某个函数时使用CCSprite* player = CCSprite:create(“Icon.png“);player-setPosition(ccp(100, 100);this-addChild(player);CCMoveTo* action
5、 = CCMoveTo:create(1, ccp(200, 200);12345/CCCallFunc 的功能非常简单,它只能简单地实现在动作序列中帮助我们调用一个函数的功能。CCCallFunc* call = CCCallFunc:create(this, callfunc_selector(HelloWorld:callBack);/下面这行代码是创建一个动作序列CCFiniteTimeAction* seq = CCSequence:create(action,call,NULL);player-runAction(seq);12345/CCCallFunc 的回调函数void He
6、lloWorld:callBack()CCLog(“CCCallFunc“);1234/CCCallFuncN 既能够调用一个方法还能够将调用的对象传过去 这里的调用对象就是 player 它是个精灵对象CCCallFuncN* callN = CCCallFuncN:create(this, callfuncN_selector(HelloWorld:callNodeBack);CCFiniteTimeAction* seq2 = CCSequence:create(action,callN,NULL);player-runAction(seq2);123456/CCCallFuncN 的回
7、调函数void HelloWorld:callNodeBack(cocos2d:CCNode *sender)CCSprite* player = (CCSprite*) sender;CCLog(“%f“,player-getPosition().x);123456789/先创建一个字典CCDictionary* dic = CCDictionary:create();dic-retain();dic-setObject(CCString:create(“zxcc“), 1);/CCCallFuncND 可以传递一个任意数据类型 例如,我们可以传递一个字典CCCallFuncND* call
8、ND = CCCallFuncND:create(this, callfuncND_selector(HelloWorld:callNodeBack),(void*)dic);CCFiniteTimeAction* seq3 = CCSequence:create(action,callND,NULL);player-runAction(seq3);12345678/CCCallFuncND 的回调函数void HelloWorld:callNodeBack(cocos2d:CCNode *sender, void * data)CCDictionary* dic = (CCDictionar
9、y*)data;CCString* str = (CCString*)(dic-objectForKey(1);CCLog(“%s“,str-getCString();12345678/我们创建一个精灵CCSprite* player2 = CCSprite:create(“player2.png“);player2-setPosition(ccp(300, 300);this-addChild(player2);/在例子中我先移动一个精灵 ,再移动另一个精灵/ CCCallFuncND 传值的类型只能为 CCObject 类型CCCallFuncO* callO = CCCallFuncO:
10、create(this, callfuncO_selector(HelloWorld:callObjectBack), player2);9 CCFiniteTimeAction* seq4 = CCSequence:create(action,callO,NULL);player-runAction(seq4);12345678/CCCallFuncO 的回调方法void HelloWorld:callObjectBack(cocos2d:CCObject *data)CCSprite* player = (CCSprite*)data;player-runAction(CCMoveTo:create(1, ccp(1 ,90);代码例子: http:/