cocos2d-x学习(二):动作Action(延时类动作)

来源:互联网 发布:数据的作用 编辑:程序博客网 时间:2024/05/16 04:00

游戏中的大部分精灵都是动态的,所以动作类是游戏引擎中不可或缺的一部分,今天就简单的记录下Cocos2d-x中常用的动作类。


Cocos2d-x提供了很多基本的动作类,主要包括两大类:一类是瞬时动作(CCActionInstant),一类是延时动作(CCActionInterval),今天主要记录一下延时动作类的一般用法。


1.Cocos2d-x提供的基本延时类动作都提供了ActionTo和ActionBy两种:(Action泛指各种动作)

ActionTo是指动作结束的状态,也就是动作的终点。

ActionBy是指动作执行的状态,也就是动作的执行过程。


常用的延时动作类包括:

移动动作:CCMoveBy   CCMoveTo

旋转动作:CCRotateBy   CCRotateTo

缩放动作:CCScaleBy   CCScaleTo

跳跃动作:CCJumpBy   CCJumpTo

淡入淡出动作:CCFadeBy   CCFadeIn   CCFadeOut

贝赛尔曲线动作:CCBezierBy   CCBezierTo

......(还有很多种,就不一一列举了,详情查看)


2.一般用法

动作中最简单的就要数移动了,下面就分别以CCMoveBy和CCMoveTo举个例子,代码很简单

[cpp] view plaincopy
  1. void HelloWorld::spriteMove()  
  2. {  
  3.     CCSize winSize = CCDirector::sharedDirector()->getWinSize();  
  4.   
  5.     CCActionInterval *actionTo = CCMoveTo::actionWithDuration(2.0f,   
  6.         CCPointMake(winSize.width * 3 / 4, winSize.height / 2));  
  7.     CCActionInterval *actionBy = CCMoveBy::actionWithDuration(2.0f,  
  8.         CCPointMake(-winSize.width / 2, 0));  
  9.     CCActionInterval *actionByCopy = (CCActionInterval *) actionBy->copy();  
  10.     CCActionInterval *actionBack = actionBy->reverse();  
  11.   
  12.     oldManSprite->runAction(CCSequence::actions(actionTo, actionByCopy, NULL));  
  13.     youngSisterSprite->runAction(CCSequence::actions(actionBy, actionBack, NULL));  
  14. }  

用法很简单,CCMoveTo中的CCPoint参数就是想要“移动到”的位置点,而CCMoveBy中的CCPoint参数就是分别对应x,y轴对应的偏移量

(这里是对cocos2d-x中的test示例做了一些修改)

这里需要注意的是actionBy不能重复使用,如果第二次使用的话,会继续从第一次使用到的位置开始继续,不明白的可以尝试一下,现象很明显!


3.动作完成回调

动作一般支持3种回调方式

(1).无发送者无数据回调:CCCallFunc,示例如下

[cpp] view plaincopy
  1. void HelloWorld::actionCallback()  
  2. {  
  3.     CCSize winSize = CCDirector::sharedDirector()->getWinSize();  
  4.   
  5.     CCLabelTTF *label = CCLabelTTF::labelWithString("Action Callback!""Marker Felt", 32);  
  6.     label->setPosition(ccp(winSize.width / 2, winSize.height / 2));  
  7.   
  8.     this->addChild(label);  
  9. }  

(2).有发送者无数据回调:CCCallFuncN  (N是CCNode),示例如下

[cpp] view plaincopy
  1. void HelloWorld::actionCallbackN(CCNode *pSender)  
  2. {  
  3.     CCSprite *sprite = (CCSprite *) pSender;  
  4.   
  5.     // 回调变红色  
  6.     sprite->setColor(ccRED);  
  7. }  

(3).有发送者有数据回调:CCCallFuncND  (N是CCNode,D是data,是void *类型)

[cpp] view plaincopy
  1. void HelloWorld::actionCallbackND(CCNode *pSender, void *data)  
  2. {  
  3.     CCSize winSize = CCDirector::sharedDirector()->getWinSize();  
  4.   
  5.     CCSprite *sprite = (CCSprite *) pSender;  
  6.   
  7.     // 回调变蓝色  
  8.     sprite->setColor(ccBLUE);  
  9.       
  10.     // 接收回调数据  
  11.     CCLabelTTF *label = CCLabelTTF::labelWithString((char *) data, "Marker Felt", 32);  
  12.     label->setPosition(ccp(winSize.width / 2, winSize.height / 2));  
  13.     this->addChild(label);  
  14.   
  15.     CCLog((char *) data);  
  16. }  

使用回调示例如下:

[cpp] view plaincopy
  1. void HelloWorld::actionListen()  
  2. {  
  3.     CCSize winSize = CCDirector::sharedDirector()->getWinSize();  
  4.   
  5.     CCFiniteTimeAction *action = CCSequence::actions(  
  6.         CCMoveBy::actionWithDuration(2.0f, CCPointMake(winSize.width / 2, 0)),  
  7.         CCCallFunc::actionWithTarget(this, callfunc_selector(HelloWorld::actionCallback)), NULL);  
  8.   
  9.     CCFiniteTimeAction *actionN = CCSequence::actions(  
  10.         CCMoveBy::actionWithDuration(2.0f, CCPointMake(-winSize.width / 2, 0)),  
  11.         CCCallFuncN::actionWithTarget(this, callfuncN_selector(HelloWorld::actionCallbackN)), NULL);  
  12.   
  13.     CCFiniteTimeAction *actionND = CCSequence::actions(  
  14.         CCMoveBy::actionWithDuration(2.0f, CCPointMake(winSize.width / 2, 0)),  
  15.         CCCallFuncND::actionWithTarget(this, callfuncND_selector(HelloWorld::actionCallbackND), (void *) "Callback Data"), NULL);  
  16.   
  17.     oldManSprite->runAction(actionND);  
  18.     youngSisterSprite->runAction(actionN);  
  19. }  

总结:要根据你的需求来定义回调函数

如果只是简单的通知,则使用CCCallFunc;如果需要知道发送者信息,则使用CCCallFuncN;如果还要附带一些数据信息,则使用CCCallFuncND


简单的测试了一下几个动作,为了方便建的是win32的工程,点击下载