今天我们来学习一下Cocos2d-x中的拖尾效果。在游戏中,拖尾效果常常用来做刀光,火球法术等一些运动物体的效果。如图:
在Cocos2d-x中,拖尾效果有一个专门的类CCMotionStreak来实现。下面我们打开CCMotionStreak.h来看一下:
[cpp]
#ifndef __CCMOTION_STREAK_H__
#define __CCMOTION_STREAK_H__
#include "CCProtocols.h"
#include "textures/CCTexture2D.h"
#include "ccTypes.h"
#include "base_nodes/CCNode.h"
//使用Cocos2d命名空间
NS_CC_BEGIN
//条带由三个基类共同派生
class CC_DLL CCMotionStreak : public CCNode, public CCTextureProtocol, public CCRGBAProtocol
{
public:
//构造
CCMotionStreak();
//析构
virtual ~CCMotionStreak();
//静态函数,创建一个拖尾效果,内部调用create实现,参一为消隐动画时长,参二为拖尾条带相邻顶点间的最小距离,参三为拖尾条带的宽度,参四为顶点颜色值,参五为所使用的纹理图片。
CC_DEPRECATED_ATTRIBUTE static CCMotionStreak* streakWithFade(float fade, float minSeg, float stroke, ccColor3B color, const char* path);
//静态函数,创建一个拖尾效果,内部调用create实现,参一为消隐动画时长,参二为拖尾条带相邻顶点间的最小距离,参三为拖尾条带的宽度,参四为顶点颜色值,参五为所使用的纹理对象指针。
CC_DEPRECATED_ATTRIBUTE static CCMotionStreak* streakWithFade(float fade, float minSeg, float stroke, ccColor3B color, CCTexture2D* texture);
//上面第一个创建函数的create实现。
static CCMotionStreak* create(float fade, float minSeg, float stroke, ccColor3B color, const char* path);
//上面第二个创建函数的create实现。
static CCMotionStreak* create(float fade, float minSeg, float stroke, ccColor3B color, CCTexture2D* texture);
//初始化拖尾效果
bool initWithFade(float fade, float minSeg, float stroke, ccColor3B color, const char* path);
//初始化拖尾效果
bool initWithFade(float fade, float minSeg, float stroke, ccColor3B color, CCTexture2D* texture);
//
void tintWithColor(ccColor3B colors);
//重置,删除所有的条带段
void reset();
//设置位置
virtual void setPosition(const CCPoint& position);
//绘制
virtual void draw();
//更新
virtual void update(float delta);
//取得纹理。
virtual CCTexture2D* getTexture(void);
//设置纹理。
virtual void setTexture(CCTexture2D *texture);
//设置
virtual void setBlendFunc(ccBlendFunc blendFunc);
virtual ccBlendFunc getBlendFunc(void);
//设置颜色
virtual void setColor(const ccColor3B& color);
virtual const ccColor3B& getColor(void);
//设置透明度
virtual GLubyte getOpacity(void);
virtual void setOpacity(GLubyte opacity);
//设置修改A同时影响RGB
virtual void setOpacityModifyRGB(bool bValue);
virtual bool isOpacityModifyRGB(void);
//是否是快速模式
inline bool isFastMode() { return m_bFastMode; }
inline void setFastMode(bool bFastMode) { m_bFastMode = bFastMode; }
//起点是否初始化
inline bool isStartingPositionInitialized() { return m_bStartingPositionInitialized; }
inline void setStartingPositionInitialized(bool bStartingPositionInitialized)
{
m_bStartingPositionInitialized = bStartingPositionInitialized;
}
protected:
//是否是快速模式
bool m_bFastMode;
//起点是否初始化
bool m_bStartingPositionInitialized;
private:
//所用的纹理对象指针
CCTexture2D* m_pTexture;
//ALPHA混合方案
ccBlendFunc m_tBlendFunc;
//当前拖尾起点位置
CCPoint m_tPositionR;
//颜色值
ccColor3B m_tColor;
//拖尾线条的宽度,越大当前越粗
float m_fStroke;
//每秒条带渐隐的alpha值减少量
float m_fFadeDelta;
//拖尾中用于划分条带的顶点的最小距离。
float m_fMinSeg;
//顶点最大数量
unsigned int m_uMaxPoints;
//当前的顶点数量
unsigned int m_uNuPoints;
//上次的顶点数量
unsigned int m_uPreviousNuPoints;
//顶点位置数组
CCPoint* m_pPointVertexes;
//顶点的状态值数组,这个状态值取值为0~1.0间,代表了消隐程度,其实就是alpha值。
float* m_pPointState;
// OPENGL所用的顶点各类数据绘冲
//位置
ccVertex2F* m_pVertices;
//颜色
GLubyte* m_pColorPointer;
//纹理UV
ccTex2F* m_pTexCoords;
};
// end of misc_nodes group
/// @}
NS_CC_END
#endif //__CCMOTION_STREAK_H__
对应的CPP:
[cpp]
#include "CCMotionStreak.h"
#include "textures/CCTextureCache.h"
#include "shaders/ccGLStateCache.h"
#include "shaders/CCGLProgram.h"
#include "shaders/CCShaderCache.h"
#include "ccMacros.h"