当前位置:编程学习 > 网站相关 >>

Cocos2d-x 2.0 网格动画深入分析

      在TestCpp中的EffectsTest示例中展示了一些屏幕特效,它是将屏幕划分为多个格子,并对这些格子进行了动画处理从而产生出相应的屏幕特效。今天我们来学习一下这些动画。
 
主要是涉及到以下几个文件:
 
CCGrid.h /cpp :网格数据及渲染,包括基本网格数据和3D网格数据,这是数据的基础。
 
CCActionGrid.h /cpp :网格基本动画,这是动画的基础。
 
CCActionGrid3D.h/cpp: 3D网格基本动画,这是3D网格动画的基础。
 
CCActionTiledGrid.h / cpp :网格衍生动画,这是最终的特效实现。
 
 
咱们首先来看 关于网格数据及渲染的文件:CCGrid.h  
 
[cpp] 
#ifndef __EFFECTS_CCGRID_H__  
#define __EFFECTS_CCGRID_H__  
  
  
#include "cocoa/CCObject.h"  
#include "base_nodes/CCNode.h"  
#include "CCCamera.h"  
#include "ccTypes.h"  
#include "textures/CCTexture2D.h"  
#include "CCDirector.h"  
#include "kazmath/mat4.h"  
  
//使用Cocos2d命名空间  
NS_CC_BEGIN  
  
//当前.h文件要用到以下三个类的指针。  
  
class CCTexture2D;  
class CCGrabber;  
class CCGLProgram;  
  
//网格基类。由CCObject派生。  
class CC_DLL CCGridBase : public CCObject  
{  
public:  
    //析构  
    virtual ~CCGridBase(void);  
  
    //是否激活状态。  
inline bool isActive(void) { return m_bActive; }  
//设置为激活状态。  
    void setActive(bool bActive);  
  
    //取得  
    inline int getReuseGrid(void) { return m_nReuseGrid; }  
    inline void setReuseGrid(int nReuseGrid) { m_nReuseGrid = nReuseGrid; }  
  
    //取得网格的大小。  
inline const ccGridSize& getGridSize(void) { return m_sGridSize; }  
//设置网格的大小。  
    inline void setGridSize(const ccGridSize& gridSize) { m_sGridSize = gridSize; }  
  
    //取得每个格子占用的图像点数。即图像大于与格子大小的比值。  
    inline const CCPoint& getStep(void) { return m_obStep; }  
    inline void setStep(const CCPoint& step) { m_obStep = step; }  
  
    //取得纹理是否上下反转  
inline bool isTextureFlipped(void) { return m_bIsTextureFlipped; }  
//设置纹理是否上下反转。  
    void setTextureFlipped(bool bFlipped);  
  
    //初始化网格,参一为网格大小,参二为对应的纹理,参三为设置纹理是否反转。  
bool initWithSize(const ccGridSize& gridSize, CCTexture2D *pTexture, bool bFlipped);  
////初始化网格,参数为网格大小。  
    bool initWithSize(const ccGridSize& gridSize);  
      
    //在渲染之前要做的处理。  
void beforeDraw(void);  
//在渲染之后要做的处理。  
void afterDraw(CCNode *pTarget);  
//渲染处理  
virtual void blit(void);  
//还原到原顶点位置  
virtual void reuse(void);  
//计算顶点缓冲  
    virtual void calculateVertexPoints(void);  
  
public:  
    //详细创建函数,参一为网格大小,参二为对应的纹理,参三为设置纹理是否反转。内部调用create实现。  
CC_DEPRECATED_ATTRIBUTE static CCGridBase* gridWithSize(const ccGridSize& gridSize, CCTexture2D *texture, bool flipped);  
      
//简单创建函数,参数为网格大小。内部调用create实现。  
    CC_DEPRECATED_ATTRIBUTE static CCGridBase* gridWithSize(const ccGridSize& gridSize);  
  
    //对应详细创建函数的create实现。  
    static CCGridBase* create(const ccGridSize& gridSize, CCTexture2D *texture, bool flipped);  
//对应简单创建函数的create实现。  
static CCGridBase* create(const ccGridSize& gridSize);  
  
    //设置2D投影矩阵。  
    void set2DProjection(void);  
  
protected:  
    //是否被激活。  
    bool m_bActive;  
int  m_nReuseGrid;  
//格子大小  
ccGridSize m_sGridSize;  
//所用纹理  
CCTexture2D *m_pTexture;  
//每格的图像点数  
CCPoint m_obStep;  
//将屏幕画面渲染到纹理的处理器。  
CCGrabber *m_pGrabber;  
//纹理是否上下反转。  
bool m_bIsTextureFlipped;  
//Shader代码片段指针。  
CCGLProgram* m_pShaderProgram;  
//投影方式  
    ccDirectorProjection m_directorProjection;  
};  
  
对应CPP:  
//简单创建函数,参一为网格大小,参二为对应的纹理,参三为设置纹理是否反转。内部调用create实现。CCGridBase* CCGridBase::gridWithSize(const ccGridSize& gridSize)  
{  
    return CCGridBase::create(gridSize);  
}  
  
//对应简单创建函数的create实现。  
CCGridBase* CCGridBase::create(const ccGridSize& gridSize)  
{  
    //先new出一个当前类实例。  
    CCGridBase *pGridBase = new CCGridBase();  
    //如果成功  
    if (pGridBase)  
{  
     //进行初始化。  
        if (pGridBase->initWithSize(gridSize))  
        {  
             //如果初始化成功交由内存管理器进行管理。  
            pGridBase->autorelease();  
        }  
        else  
        {  
             //如果失败释放并置空。  
            CC_SAFE_RELEASE_NULL(pGridBase);  
        }  
    }  
    //如果成功返回创建的类实例,否则反回NULL。  
    return pGridBase;  
}  
  
//详细创建函数,参数为网格大小。内部调用create实现。  
CCGridBase* CCGridBase::gridWithSize(const ccGridSize& gridSize, CCTexture2D *texture, bool flipped)  
{  
    return CCGridBase::create(gridSize, texture, flipped);  
}  
//对应详细创建函数
补充:综合编程 , 其他综合 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,