当前位置:编程学习 > wap >>

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

补充:移动开发 , 其他 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,