Cocos2d-x2.0 进度动画 深入分析
在Cocos2d-x 2.0中有一个工程例子叫"ActionsProgressTest",故明思义是进度动画的演示,应该说在几乎所有的RPG类游戏中我们都会看到进度条,所以进度动画的作用之大是无须我多言。我们本节就来学习一下Cocos2d-x 2.0的进度动画。
首先,先把那个"ActionsProgressTest"放一边,我要做的不是让大家去知其然,而是要知其所以然。所以我们要学习一下进度动画的原理与实现,在此我们向大家介绍一下所要用到的三个关键功能类:
1.CCProgressTimer : 进度动画的渲染器,核心实现了进度动画的显示功能,本身是一个结点,通过渲染一个精灵来表现进度的变化。
2.CCProgressTo: TO进度控制器,控制进度从当前进度变化到某个值.
3.CCProgressFromTo: FromTo进度控制器,控制进度从一个指定值到另一个值的变化.
咱们先来看一下CCProgressTimer,这个类是整个进度动画的重中之重。
打开CCProgressTimer .h:
[cpp]
#ifndef __MISC_NODE_CCPROGRESS_TIMER_H__
#define __MISC_NODE_CCPROGRESS_TIMER_H__
//使用精灵类
#include "sprite_nodes/CCSprite.h"
//使用Cocos2d命名空间
NS_CC_BEGIN
//定义一个枚举,代表两种不同的进度动画目标渲染类型。
typedef enum {
///绕圆心转动的进度动画
kCCProgressTimerTypeRadial,
///条形的进度动画。
kCCProgressTimerTypeBar,
} CCProgressTimerType;
//由CCNode和CCRGBAProtocol派生出CCProgressTimer类。
class CC_DLL CCProgressTimer : public CCNode, public CCRGBAProtocol
{
public:
//构造函数。
CCProgressTimer();
//析构函数。
~CCProgressTimer(void);
//取得当前的进度动画目标渲染类型
inline CCProgressTimerType getType(void) { return m_eType; }
//返回当前时刻的进度值。
inline float getPercentage(void) {return m_fPercentage; }
//取得当前进度动画所渲染的精灵。
inline CCSprite* getSprite(void) { return m_pSprite; }
//设置当前进度动画所渲染的精灵,并初始化动画。
bool initWithSprite(CCSprite* sp);
//设置当前时刻的进度值。
void setPercentage(float fPercentage);
//设置当前进度动画所渲染的精灵
void setSprite(CCSprite *pSprite);
//设置当前的进度动画目标渲染类型
void setType(CCProgressTimerType type);
//设置是否反向播放进度动画。
void setReverseProgress(bool reverse);
//渲染当前结点。
virtual void draw(void);
//设置锚点位置。
void setAnchorPoint(CCPoint anchorPoint);
//设置颜色。
virtual void setColor(const ccColor3B& color);
//取得颜色。
virtual const ccColor3B& getColor(void);
//取得透明度。
virtual GLubyte getOpacity(void);
//设置透明度。
virtual void setOpacity(GLubyte opacity);
//设置透明度是否按颜色值变动而变动。
virtual void setOpacityModifyRGB(bool bValue);
//取得透明度是否按颜色值变动而变动。
virtual bool isOpacityModifyRGB(void);
//取得是否是按反方向播放动画。
inline bool isReverseDirection() { return m_bReverseDirection; };
//设置是否按反方向播放动画。
inline void setReverseDirection(bool value) { m_bReverseDirection = value; };
public:
//静态函数,创建一个进度时间控制器,内部调用create实现.
CC_DEPRECATED_ATTRIBUTE static CCProgressTimer* progressWithSprite(CCSprite* sp);
//同上.
static CCProgressTimer* create(CCSprite* sp);
protected:
//由一个二维插值参数值计算出纹理坐标U,V。
ccTex2F textureCoordFromAlphaPoint(CCPoint alpha);
//由一个二维插值参数值计算出顶点坐标X,Y。
ccVertex2F vertexFromAlphaPoint(CCPoint alpha);
//更新进度
void updateProgress(void);
//更新条形进度的状态
void updateBar(void);
//更新绕圆心转动的状态
void updateRadial(void);
//更新颜色
void updateColor(void);
//
CCPoint boundaryTexCoord(char index);
protected:
//进度动画目标渲染类型
CCProgressTimerType m_eType;
//当前的进度值
float m_fPercentage;
//所渲染的精灵.
CCSprite *m_pSprite;
//顶点数量
int m_nVertexDataCount;
//顶点数据指针。
ccV2F_C4B_T2F *m_pVertexData;
//这里是一个称为“中点”的成员变量值,但它的意义绝不是这么简单,如果是绕中心旋转的进度动画,它就是中心,如果是条形动画,它代表了UV随进度变化的起始位置,如果是在最左边,其值为(0,y),如果是在最右边,其值为(1,y),如果在最上面(x,0),如果在最下面(x,1);如果是在中心(0.5,0.5)。
CC_PROPERTY(CCPoint, m_tMidpoint, Midpoint);
//设里是一个表示动画方向的成员变量值,如果是横向方向,则设为(1,0),如果是纵向方向,则设为(0,1);
CC_SYNTHESIZE(CCPoint, m_tBarChangeRate, BarChangeRate);
//bool变量,代表是否反方向播放动画。
bool m_bReverseDirection;
};
NS_CC_END
#endif
再来看CPP文件:
[cpp]
#include "CCProgressTimer.h"
#include "ccMacros.h"
#include "textures/CCTextureCache.h"
#include "support/CCPointExtension.h"
#include "shaders/CCGLProgram.h"
#include "shaders/CCShaderCache.h"
#include "shaders/ccGLStateCache.h"
#include "CCDirector.h"
#include "support/TransformUtils.h"
#include "CCDrawingPrimitives.h"
// extern
#include "kazmath/GL/matrix.h"
#include <float.h>
//使用Cocos2d命名空间
NS_CC_BEGIN
//定义动画的四边形的四个角的纹理UV数量
#de
补充:移动开发 , 其他 ,