在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);
}
//对应详细创建函数
补充:综合编程 , 其他综合 ,