【cocos2dx之CCAnimation、CCAnimate、CCAnimationCache使用】

一个精灵的动画该怎么理解?
我的理解就是场景中原本死气沉沉的精灵在原地动起来了。
CCAnimation和CCAnimate的官方源代码解释是下面这段话【版本cocos2dx-2.2.2】

/** A CCAnimation object is used to perform animations on the CCSprite objects.
The CCAnimation object contains CCAnimationFrame objects,and a possible delay between the frames.
You can animate a CCAnimation object by using the CCAnimate action. Example:
[sprite runAction:[CCAnimate actionWithAnimation:animation]];
*/
class CC_DLL CCAnimation : public CCObject
{
public:
/**
* @js ctor
*/
CCAnimation();
/**
* @js NA
* @lua NA
*/
~CCAnimation(void);
public:
/** Creates an animation
@since v0.99.5
*/
static CCAnimation* create(void);
/* Creates an animation with an array of CCSpriteFrame and a delay between frames in seconds.
The frames will be added with one "delay unit".
@since v0.99.5
@js create
*/
static CCAnimation* createWithSpriteFrames(CCArray* arrayOfSpriteFrameNames,float delay = 0.0f);
/* Creates an animation with an array of CCAnimationFrame,the delay per units in seconds and and how many times it should be executed.
@since v2.0
*/
static CCAnimation* create(CCArray *arrayOfAnimationFrameNames,float delayPerUnit,unsigned int loops);
static CCAnimation* create(CCArray *arrayOfAnimationFrameNames,float delayPerUnit) {
return CCAnimation::create(arrayOfAnimationFrameNames,delayPerUnit,1);
}
/** Adds a CCSpriteFrame to a CCAnimation.
The frame will be added with one "delay unit".
*/
void addSpriteFrame(CCSpriteFrame *pFrame);
/** Adds a frame with an image filename. Internally it will create a CCSpriteFrame and it will add it.
The frame will be added with one "delay unit".
Added to facilitate the migration from v0.8 to v0.9.
* @js addSpriteFrameWithFile
*/
void addSpriteFrameWithFileName(const char *pszFileName);
/** Adds a frame with a texture and a rect. Internally it will create a CCSpriteFrame and it will add it.
The frame will be added with one "delay unit".
Added to facilitate the migration from v0.8 to v0.9.
*/
void addSpriteFrameWithTexture(CCTexture2D* pobTexture,const CCRect& rect);
/**
* @lua NA
*/
bool init();
/** Initializes a CCAnimation with frames and a delay between frames
@since v0.99.5
@lua NA
*/
bool initWithSpriteFrames(CCArray *pFrames,float delay = 0.0f);
/** Initializes a CCAnimation with CCAnimationFrame
@since v2.0
@lua NA
*/
bool initWithAnimationFrames(CCArray* arrayOfAnimationFrames,unsigned int loops);
/**
* @js NA
* @lua NA
*/
virtual CCObject* copyWithZone(CCZone* pZone);
/** total Delay units of the CCAnimation. */
CC_SYNTHESIZE_READONLY(float,m_fTotalDelayUnits,TotalDelayUnits)
/** Delay in seconds of the "delay unit" */
CC_SYNTHESIZE(float,m_fDelayPerUnit,DelayPerUnit)
/** duration in seconds of the whole animation. It is the result of totalDelayUnits * delayPerUnit */
CC_PROPERTY_READONLY(float,m_fDuration,Duration)
/** array of CCAnimationFrames */
CC_SYNTHESIZE_RETAIN(CCArray*,m_pFrames,Frames)
/** whether or not it shall restore the original frame when the animation finishes */
CC_SYNTHESIZE(bool,m_bRestoreOriginalFrame,RestoreOriginalFrame)
/** how many times the animation is going to loop. 0 means animation is not animated. 1,animation is executed one time,... */
CC_SYNTHESIZE(unsigned int,m_uLoops,Loops)
};

/** @brief Animates a sprite given the name of an Animation */
class CC_DLL CCAnimate : public CCActionInterval
{
public:
/**
* @js ctor
*/
CCAnimate();
/**
* @js NA
* @lua NA
*/
~CCAnimate();
/** initializes the action with an Animation and will restore the original frame when the animation is over */
bool initWithAnimation(CCAnimation *pAnimation);
/**
* @js NA
* @lua NA
*/
virtual CCObject* copyWithZone(CCZone* pZone);
virtual void startWithTarget(CCNode *pTarget);
virtual void stop(void);
virtual void update(float t);
virtual CCActionInterval* reverse(void);
public:
/** creates the action with an Animation and will restore the original frame when the animation is over */
static CCAnimate* create(CCAnimation *pAnimation);
CC_SYNTHESIZE_RETAIN(CCAnimation*,m_pAnimation,Animation)
protected:
std::vector<float>* m_pSplitTimes;
int m_nNextFrame;
CCSpriteFrame* m_pOrigFrame;
unsigned int m_uExecutedLoops;
};

看着有点迷茫呀!!理一理思路。
其实我们在运用的过程中遵循以下步骤就行了。
一、创建CCAnimation
1.通过CCAnimationCache创建

CCAnimationCache *animationcache = CCAnimationCache::sharedAnimationCache();
animationcache->addAnimationsWithFile("animations/animations-2.plist");
CCAnimation *animation = animationcache->animationByName("dance_1");//刚开始不知道这个参数是哪里来的,其实是plist里面的,你用记事本打开就可以看得到,它是一个动画标识
animation->setRestoreOriginalFrame(true);
2.通过CCAnimation的create***函数或是add***函数创建
用create***函数创建
CCArray *animations = CCArray::createWithCapacity(14);  
char str[100]={0};
for(int i = 1; i< 14; i++)
{
sprintf(str,”grossini_dance_%02d.png”,i); 
CCSpriteFrame *frame = frameCache->spriteFrameByName(str);  
animations->addObject(frame);  
}
CCAnimation* animation = CCAnimation::createWithSpriteFrames(animations,2.0f);
当然,你也可以通过add***函数创建
CCAnimation* animation = CCAnimation::create();
for( int i=1;i<15;i++)
 {
        char szName[100] = {0};
        sprintf(szName,"Images/grossini_dance_%02d.png",i);
        animation->addSpriteFrameWithFileName(szName); //加载动画的帧
 }
二、通过CCAnimation创建CCAnimate
这个就比较简单了,一般就是
CCAnimate *animate = CCAnimate::create(animation);
三、通过CCSprite的runaction绑定CCAnimate到精灵。
也比较简单
sprite->runAction(CCSequence::create(animate,animate->reverse(),NULL));

参考文章:

http://www.jb51.cc/article/p-yugmmlhp-bch.html

http://www.jb51.cc/article/p-bwlbigwy-bch.html

http://cocos2d.9tech.cn/news/2014/0303/39946.html

http://www.jb51.cc/article/p-ffbjhgci-bme.html

相关文章

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