【Cocos2dx】动作监听

其实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的动作监听就是如此的简单。

相关文章

    本文实践自 RayWenderlich、Ali Hafizji 的文章《...
Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@1...
第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从C...
    Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发...
1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《...
   Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试...