其实Cocos2dx动作监听,如果把《【Cocos2dx】基本动作、动作序列与动作合并》(点击打开链接)联系起来,就变得简单了。所谓的“Cocos2dx动作监听”实质上就是一个在某一段动作之后执行的函数,一个“假”动作,下面继续用一个例子来说明这个问题。
如下图,一个按钮精灵,在闪烁3次并向上移动100px之后,在屏幕上显示"Action Done!",实质就是在屏幕上添加"Action Done!"的标签。
首先还是新建一个用cpp语言写的名为moveAction的Cocos2dx工程,打开里面proj.win32的HelloCpp.sln开始程序编写,在AppDelegate.cpp关掉调试信息,此步骤已经在此前文章多次提及,不会的可以参看《【Cocos2dx】Windows平台下Cocos2dx 2.x的下载、安装、配置,打造自己的Helloworld》(点击打开链接)。
之后先在HelloWorldScene.h删除原关闭按钮的函数声明,替换成动作回调/动作监听的函数声明,与一些宏定义信息。
#include "cocos2d.h" class HelloWorld : public cocos2d::CCLayer { public: // Here's a difference. Method 'init' in cocos2d-x returns bool,instead of returning 'id' in cocos2d-iphone virtual bool init(); // there's no 'id' in cpp,so we recommend returning the class instance pointer static cocos2d::CCScene* scene(); void actionCallback();//声明一个回调函数 // implement the "static node()" method manually CREATE_FUNC(HelloWorld); };最后,把HelloWorldScene.cpp修改成如下代码。主要是bool HelloWorld::init()的修改与删去原来的关闭按钮函数,新建一个属于自己的动作监听函数HelloWorld::actionCallback()
#include "HelloWorldScene.h" USING_NS_CC; CCScene* HelloWorld::scene() { // 'scene' is an autorelease object CCScene *scene = CCScene::create(); // 'layer' is an autorelease object HelloWorld *layer = HelloWorld::create(); // add layer as a child to scene scene->addChild(layer); // return the scene return scene; } // on "init" you need to initialize your instance bool HelloWorld::init() { //获取屏幕的尺寸、位置信息等 CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize(); //设置精灵,并把精灵添加到舞台的中央 CCSprite *sprite=CCSprite::create("CloseSelected.png"); sprite->setPosition(ccp(visibleSize.width/2,visibleSize.height/2)); this->addChild(sprite); //动作1 CCFiniteTimeAction* action1=CCBlink::create(1.0f,3); //在一秒内闪烁三次 //动作2 CCFiniteTimeAction* action2=CCMoveBy::create(1.0f,ccp(0,100)); //在1秒内提升100px //声明动作回调函数 CCCallFunc *callFunc=CCCallFunc::create(this,callfunc_selector(HelloWorld::actionCallback)); //合并上述动作,并应用到精灵 CCFiniteTimeAction* sequence=CCSequence::create(action1,action2,callFunc,NULL); sprite->runAction(sequence); return true; } void HelloWorld::actionCallback() { CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();//获取屏幕的尺寸、位置信息等 CCLabelTTF *labelTTF = CCLabelTTF::create("Action Done!","arial",72);//声明一个文字 labelTTF->setPosition(ccp(visibleSize.width/2,visibleSize.height/2));//将此文字添加到屏幕的中间位置 this->addChild(labelTTF); }与《【Cocos2dx】基本动作、动作序列与动作合并》( 点击打开链接)一样,先声明一个精灵,图片为自带的按钮,之后给予它闪烁与上升动作。
关键是通过CCCallFunc声明一个动作回调函数为HelloWorld::actionCallback,Cocos2dx的动作声明如同《【Cocos2dx】使用CCControlButton创建按钮、按钮点击事件,点击事件中的组件获取,setPosition的坐标问题》(点击打开链接)。
最后将这个动作回调函数与闪烁、上升两个动作联系起来的方法,同样是通过CCSequence建立一个动作序列,只是callFunc动作位于action1与action2之后,然后其执行的动作,是我们自己手写的void HelloWorld::actionCallback(){}
Cocos2dx的动作监听就是如此的简单。