本文来自http://blog.csdn.net/runaying ,引用必须注明出处!
温馨提醒:为了大家能更好学习,强烈推荐大家看看本人的这篇博客 Cocos2d-X权威指南笔记
粒子系统的基类,重力模式、半径模式 备注:变动 是,每一次 增减/减少 的固定值
///cocos2d-x-3.0alpha0/cocos2dx/particle_nodes
//粒子系统的基类,重力模式、半径模式 备注:变动 是,每一次 增减/减少 的固定值
#ifndef __CCPARTICLE_SYSTEM_H__
#define __CCPARTICLE_SYSTEM_H__
#include "CCProtocols.h"
#include "base_nodes/CCNode.h"
#include "cocoa/CCDictionary.h"
#include "cocoa/CCString.h"
NS_CC_BEGIN
/**
* @addtogroup particle_nodes
* @{
*/
class ParticleBatchNode;
/**
包含每个粒子的值的结构
*/
typedef struct sParticle {
Point pos;
Point startPos;
Color4F color;
Color4F deltaColor;
float size;
float deltaSize;
float rotation;
float deltaRotation;
float timeToLive;
unsigned int atlasIndex;
//! Mode A: gravity, direction, radial accel, tangential accel //重力,方向,径向加速度,切向加速度
struct {
Point dir;
float radialAccel;
float tangentialAccel;
} modeA;
//! Mode B: radius mode
struct {
float angle;
float degreesPerSecond;
float radius;
float deltaRadius;
} modeB;
}tParticle;
//typedef void (*CC_UPDATE_PARTICLE_IMP)(id, SEL, tParticle*, Point);
class Texture2D;
/** @brief 粒子系统的基类。
一个粒子系统的属性:
- 颗粒的发射率
- 重力模式 (Mode A):
- gravity //重力
- direction //方向
- speed +- variance //速度 + -变动
- tangential acceleration +- variance //切向加速度+ - 变动
- radial acceleration +- variance //径向加速度+ - 变动
- Radius Mode (Mode B): //半径模式
- startRadius +- variance //开始半径+- 变动
- endRadius +- variance //结束半径+- 变动
- rotate +- variance //环绕 +- 变动
- Properties common to all modes: //所有模式共同的属性
- life +- life variance //life 变动
- start spin +- variance //开始旋转+ - 变动
- end spin +- variance //结束旋转+ - 变动
- start size +- variance //初始尺寸+- 变动
- end size +- variance //结束尺寸+- 变动
- start color +- variance //初始+- 变动
- end color +- variance //结束尺寸+- 变动
- life +- variance //生命值 +- 变动
- blending function //混合功能
- texture
cocos2d 也支持 Particle Designer 生成 particles (http://particledesigner.71squared.com/).
Particle Designer 的 'Radius Mode'使用 30 hz 的固定发射率. 在 cocos2d 里面不能保证
cocos2d 中采用了另一种方法,但结果几乎是相同的
Particle Designer 支持所有 cocos2d 变量,在加上下面一些:
- spinning particles (supported when using ParticleSystemQuad) //自旋粒子(使用ParticleSystemQuad时支持)
- tangential acceleration (Gravity mode) //切向加速度(重力模式)
- radial acceleration (Gravity mode)
- radius direction (Radius mode) (Particle Designer supports outwards to inwards direction only) //半径方向(半径模式)((Particle Designer 只支持从外向内的方向)
在运行时可以自定义任何上述物品,例如:
@code
emitter.radialAccel = 15; //发射器的径向加速
emitter.startSpin = 0; //发射器的开始旋转
@endcode
*/
class CC_DLL ParticleSystem : public Node, public TextureProtocol
{
public:
enum class Mode
{
GRAVITY,
RADIUS,
};
/** @typedef PositionType
粒子位置的可能类型
*/
enum class PositionType
{
/** 附着于世界的 Living particles 受发射器重新定位影响. */
FREE,
/** 附着于世界的 Living particles 遵循发射器的重新定位。
使用情况: 在 sprite 上附加发射器,你希望发射器跟随 sprite.
*/
RELATIVE,
/** Living particles 附着于发射器,和跟随它一起转换. */
GROUPED,
};
//* @enum
enum {
/** 粒子发射器永远 lives */
DURATION_INFINITY = -1,
/** 粒子的初始尺寸,等于结束尺寸 */
START_SIZE_EQUAL_TO_END_SIZE = -1,
/** 粒子的起始半径等于结束半径 */
START_RADIUS_EQUAL_TO_END_RADIUS = -1,
};
/** 从一个plist文件创建并初始化一个粒子系统,这个plist文件可以手动创建或者使用 Particle Designer 创建:
http://particledesigner.71squared.com/
@since v2.0
*/
static ParticleSystem * create(const char *plistFile);
//! 使用 固定数量的颗粒 建立一个系统
static ParticleSystem* createWithTotalParticles(unsigned int numberOfParticles);
/**
* @js ctor
*/
ParticleSystem();
/**
* @js NA
* @lua NA
*/
virtual ~ParticleSystem();
/** 初始化一个 ParticleSystem*/
bool init();
/** 从一个plist文件创建并初始化一个粒子系统,这个plist文件可以手动创建或者使用 Particle Designer 创建:
http://particledesigner.71squared.com/
@since v0.99.3
*/
bool initWithFile(const char *plistFile);
/** 使用 Dictionary 初始化一个 QuadParticleSystem .
@since v0.99.3
*/
bool initWithDictionary(Dictionary *dictionary);
/** 使用 NSDictionary,需要加载的 png 文件路径 初始化一个 particle system
@since v2.1
*/
bool initWithDictionary(Dictionary *dictionary, const char *dirname);
//! 使用 固定数量的颗粒 初始化一个系统
virtual bool initWithTotalParticles(unsigned int numberOfParticles);
//! 添加粒子到发射器
bool addParticle();
//! 初始化粒子
void initParticle(tParticle* particle);
//! 停止发射粒子。运行的粒子将继续运行,直到他们死了
void stopSystem();
//! 杀死所有 living 粒子。
void resetSystem();
//! whether or not the system is full //系统是否充满
bool isFull();
//! 应该由子类重写
virtual void updateQuadWithParticle(tParticle* particle, const Point& newPosition);
//! 应该由子类重写
virtual void postStep();
virtual void updateWithNoTime(void);
virtual bool isAutoRemoveOnFinish() const;
virtual void setAutoRemoveOnFinish(bool var);
// mode A
virtual const Point& getGravity();
virtual void setGravity(const Point& g);
virtual float getSpeed() const;
virtual void setSpeed(float speed);
virtual float getSpeedVar() const;
virtual void setSpeedVar(float speed);
virtual float getTangentialAccel() const;
virtual void setTangentialAccel(float t);
virtual float getTangentialAccelVar() const;
virtual void setTangentialAccelVar(float t);
virtual float getRadialAccel() const;
virtual void setRadialAccel(float t);
virtual float getRadialAccelVar() const;
virtual void setRadialAccelVar(float t);
virtual bool getRotationIsDir() const;
virtual void setRotationIsDir(bool t);
// mode B
virtual float getStartRadius() const;
virtual void setStartRadius(float startRadius);
virtual float getStartRadiusVar() const;
virtual void setStartRadiusVar(float startRadiusVar);
virtual float getEndRadius() const;
virtual void setEndRadius(float endRadius);
virtual float getEndRadiusVar() const;
virtual void setEndRadiusVar(float endRadiusVar);
virtual float getRotatePerSecond() const;
virtual void setRotatePerSecond(float degrees);
virtual float getRotatePerSecondVar() const;
virtual void setRotatePerSecondVar(float degrees);
virtual void setScale(float s);
virtual void setRotation(float newRotation);
virtual void setScaleX(float newScaleX);
virtual void setScaleY(float newScaleY);
virtual bool isActive() const;
virtual bool isBlendAdditive() const;
virtual void setBlendAdditive(bool value);
virtual ParticleBatchNode* getBatchNode() const;
virtual void setBatchNode(ParticleBatchNode* batchNode);
// 批处理 array 系统的索引
inline int getAtlasIndex() const { return _atlasIndex; };
inline void setAtlasIndex(int index) { _atlasIndex = index; };
/** 当前时刻被模拟的粒子数量 */
inline unsigned int getParticleCount() const { return _particleCount; };
/** 发射器将运行多少秒. -1 意味着 'forever' */
inline float getDuration() const { return _duration; };
inline void setDuration(float duration) { _duration = duration; };
/** sourcePosition of the emitter(发射源的位置) */
inline const Point& getSourcePosition() const { return _sourcePosition; };
inline void setSourcePosition(const Point& pos) { _sourcePosition = pos; };
/** 发射器位置的变动量 */
inline const Point& getPosVar() const { return _posVar; };
inline void setPosVar(const Point& pos) { _posVar = pos; };
/** life, 每个粒子的 life 变动量 */
inline float getLife() const { return _life; };
inline void setLife(float life) { _life = life; };
/** 每个粒子的 life 变动量 */
inline float getLifeVar() const { return _lifeVar; };
inline void setLifeVar(float lifeVar) { _lifeVar = lifeVar; };
/** angle ,每个粒子的角度变化量 */
inline float getAngle() const { return _angle; };
inline void setAngle(float angle) { _angle = angle; };
/** 每个粒子的角度变化量 */
inline float getAngleVar() const { return _angleVar; };
inline void setAngleVar(float angleVar) { _angleVar = angleVar; };
/** 不同类型的发射模式之间的切换:
- kParticleModeGravity: uses gravity, speed, radial and tangential acceleration
- kParticleModeRadius: uses radius movement + rotation
*/
inline Mode getEmitterMode() const { return _emitterMode; };
inline void setEmitterMode(Mode mode) { _emitterMode = mode; };
/** 每个粒子的初始化时的尺寸(以像素为单位) */
inline float getStartSize() const { return _startSize; };
inline void setStartSize(float startSize) { _startSize = startSize; };
/** 每个粒子的尺寸变化量(以像素为单位) */
inline float getStartSizeVar() const { return _startSizeVar; };
inline void setStartSizeVar(float sizeVar) { _startSizeVar = sizeVar; };
/** 每个粒子的结束时的尺寸(以像素为单位) */
inline float getEndSize() const { return _endSize; };
inline void setEndSize(float endSize) { _endSize = endSize; };
/** 结束时每个粒子的尺寸变化量(以像素为单位) */
inline float getEndSizeVar() const { return _endSizeVar; };
inline void setEndSizeVar(float sizeVar) { _endSizeVar = sizeVar; };
/** 每个粒子开始颜色 */
inline const Color4F& getStartColor() const { return _startColor; };
inline void setStartColor(const Color4F& color) { _startColor = color; };
/** 每个粒子开始颜色的变动量 */
inline const Color4F& getStartColorVar() const { return _startColorVar; };
inline void setStartColorVar(const Color4F& color) { _startColorVar = color; };
/** end color,结束时每个粒子的颜色变化量 */
inline const Color4F& getEndColor() const { return _endColor; };
inline void setEndColor(const Color4F& color) { _endColor = color; };
/** 结束时每个粒子的颜色变化量 */
inline const Color4F& getEndColorVar() const { return _endColorVar; };
inline void setEndColorVar(const Color4F& color) { _endColorVar = color; };
//* 每个粒子的初始角度
inline float getStartSpin() const { return _startSpin; };
inline void setStartSpin(float spin) { _startSpin = spin; };
//* 每个粒子的初始角度
inline float getStartSpinVar() const { return _startSpinVar; };
inline void setStartSpinVar(float pinVar) { _startSpinVar = pinVar; };
//* 每个粒子的初始角度
inline float getEndSpin() const { return _endSpin; };
inline void setEndSpin(float endSpin) { _endSpin = endSpin; };
//* 每个粒子的初始角度
inline float getEndSpinVar() const { return _endSpinVar; };
inline void setEndSpinVar(float endSpinVar) { _endSpinVar = endSpinVar; };
/** 粒子的发射率 */
inline float getEmissionRate() const { return _emissionRate; };
inline void setEmissionRate(float rate) { _emissionRate = rate; };
/** 系统的最大粒子 */
virtual int getTotalParticles() const;
virtual void setTotalParticles(int totalParticles);
/** 使用alpha值修改颜色 */
inline void setOpacityModifyRGB(bool opacityModifyRGB) { _opacityModifyRGB = opacityModifyRGB; };
inline bool isOpacityModifyRGB() const { return _opacityModifyRGB; };
CC_DEPRECATED_ATTRIBUTE inline bool getOpacityModifyRGB() const { return isOpacityModifyRGB(); }
/** 粒子的运动类型:自由或分组
@since v0.8
*/
inline PositionType getPositionType() const { return _positionType; };
inline void setPositionType(PositionType type) { _positionType = type; };
// Overrides
virtual void update(float dt) override;
virtual Texture2D* getTexture() const override;
virtual void setTexture(Texture2D *texture) override;
/**
*@code
*当这个函数绑定到 js or lua,输入参数会改变
*In js: var setBlendFunc(var src, var dst)
*In lua: local setBlendFunc(local src, local dst)
*@endcode
*/
virtual void setBlendFunc(const BlendFunc &blendFunc) override;
/**
* @js NA
* @lua NA
*/
virtual const BlendFunc &getBlendFunc() const override;
protected:
virtual void updateBlendFunc();
protected:
/** 添加时是否使用混合功能.
如果启用,下列混合功能将使用
@code
source blend function = GL_SRC_ALPHA;
dest blend function = GL_ONE;
@endcode
*/
bool _isBlendAdditive;
/** 没有 颗粒离开时,节点是否被自动删除
By default it is false.
@since v0.8
*/
bool _isAutoRemoveOnFinish;
std::string _plistFile;
//! 从系统开始到现在所经历的时间
float _elapsed;
// Different modes
//! Mode A:Gravity + Tangential Accel + Radial Accel
struct {
/** 重力值。仅适用于 'Gravity' 模式. */
Point gravity;
/** 每个粒子的速度。仅适用于 'Gravity' 模式. */
float speed;
/** 每个粒子的速度变动. 仅适用于 'Gravity' 模式. */
float speedVar;
/** 每个粒子的切向加速度. 仅适用于 'Gravity' 模式. */
float tangentialAccel;
/** 每个粒子的切向加速度变动. 仅适用于 'Gravity' 模式. */
float tangentialAccelVar;
/** 每个粒子的径向加速度. 仅适用于 'Gravity' 模式. */
float radialAccel;
/** 每个粒子的径向加速度变动. 仅适用于 'Gravity' 模式. */
float radialAccelVar;
/** 设置每个粒子的旋转方向,仅适用于 'Gravity' 模式. */
bool rotationIsDir;
} modeA;
//! Mode B: circular movement (gravity, radial accel 、 tangential accel 不要在这个模型里面使用)
struct {
/** 粒子的起始半径. 仅适用于 'Radius' 模式. */
float startRadius;
/** 粒子的起始半径变动. 仅适用于 'Radius' 模式. */
float startRadiusVar;
/** 结束时的粒子半径. 仅适用于 'Radius' 模式. */
float endRadius;
/** 结束时粒子半径变动. 仅适用于 'Radius' 模式. */
float endRadiusVar;
/** 源位置周围的粒子每秒旋转角度. 仅适用于 'Radius' 模式. */
float rotatePerSecond;
/** 每秒的旋转变动. 仅适用于 'Radius' 模式. */
float rotatePerSecondVar;
} modeB;
//! 粒子 Array
tParticle *_particles;
// 色彩调节
// BOOL colorModulate;
//!每秒可发出多少粒子
float _emitCounter;
//! particle idx
int _particleIdx;
// Optimization //优化
//CC_UPDATE_PARTICLE_IMP updateParticleImp;
//SEL updateParticleSel;
/** the SpriteBatchNode 呈现 Sprite 是弱引用 */
ParticleBatchNode* _batchNode;
// 在批处理 array 里面的索引
int _atlasIndex;
//true 如果 缩放/旋转
bool _transformSystemDirty;
// 分配的粒子数
int _allocatedParticles;
/** 是否激活了发射器 */
bool _isActive;
/** 当前时刻被模拟的颗粒数量 */
int _particleCount;
/** 发射器将运行多久 -1 意味着 'forever' */
float _duration;
/** 发射源的位置*/
Point _sourcePosition;
/** 发射器的位置变动量 */
Point _posVar;
/** life,每个粒子的 life 变动量 */
float _life;
/** 每个粒子的 life 变动量 */
float _lifeVar;
/** angle ,每个粒子的角度变化量 */
float _angle;
/** 每个粒子的角度变化量 */
float _angleVar;
/** 不同类型的发射模式之间切换:
- kParticleModeGravity: uses gravity, speed, radial and tangential acceleration
- kParticleModeRadius: uses radius movement + rotation
*/
Mode _emitterMode;
/** 每个粒子的初始化尺寸(以像素为单位) */
float _startSize;
/** 每个粒子的尺寸变化量 */
float _startSizeVar;
/** 每个粒子的结束时的尺寸(以像素为单位) */
float _endSize;
/** 每个粒子的尺寸变化量*/
float _endSizeVar;
/** 每个粒子开始颜色 */
Color4F _startColor;
/** 每个粒子开始颜色的变动量 */
Color4F _startColorVar;
/** end color ,结束时每个粒子的颜色变化量 */
Color4F _endColor;
/** 结束时每个粒子的颜色变化量 */
Color4F _endColorVar;
//* 每个粒子的初始角度
float _startSpin;
//* 每个粒子的初始角度
float _startSpinVar;
//* 每个粒子的初始角度
float _endSpin;
//* 每个粒子的初始角度
float _endSpinVar;
/** 粒子的发射率 */
float _emissionRate;
/** 系统的最大粒子 */
int _totalParticles;
/** 符合 CocosNodeTexture 协议 */
Texture2D* _texture;
/** 符合 CocosNodeTexture 协议 */
BlendFunc _blendFunc;
/** 使用alpha值修改颜色 */
bool _opacityModifyRGB;
/** 粒子的运动类型:自由或分组
@since v0.8
*/
PositionType _positionType;
};
// end of particle_nodes group
/// @}
NS_CC_END
#endif //__CCPARTICLE_SYSTEM_H__