粒子系统的组成
一个例子系统通常由以下几个关键部分组成:
l 粒子(Particles)
每一个粒子就是一个图形对象,可以使一色点或者一个图片。下面就是CocosNoded关于粒子的定义:(文件 CCParticleSystem.h)
typedef struct sParticle
{
CGPoint pos; // A位置
CGPoint startPos; // A开始位置
CGPoint dir; // A运动方向
float radialAccel; // 径向加速度。逃离发射原点的速度
float tangentialAccel; // 切线加速度。围绕发射原点旋转速度
ccColor4F color; // A颜色
ccColor4F deltaColor; // B颜色变化
float size; // A大小
float deltaSize; // B大小变化
float angle; // A角度
float deltaAngle; // B角度变化量
float life; // A存在时间
} Particle;
每一个粒子都有自己独立的属性,按照之前关于粒子系统的定义包括两大类:
A类,表述粒子的主属性,也就是宏观系统需要的宏观特性。
B类,代表每个例子的无规则变化属性,也就是微观特性。
这里需要说明的是,发射器对象在生成每一个的时候,已经会在宏观特性的基础之上设置每一个粒子的个性,B类变量保存了这种变化在生命周期中的单步变换量。
l 发射器(emitter)
发射器对象就是一个粒子系统的整体,一片云,一团雾,一次闪电,一股烟都是由一个独立的粒子系统来模拟的,Cocos2d-iPhone中关于粒子系统的定义如下:(文件 CCParticleSystem.h):
@interface CCParticleSystem : CCNode <CCTextureProtocol>
{
int id;
// is the particle system active ?
BOOL active;
// duration in seconds of the system. -1 is infinity
float duration;
// time elapsed since the start of the system (in seconds)
float elapsed;
/// Gravity of the particles
CGPoint gravity; //A所有粒子的纵、横运动速度。
// position is from "superclass" CocosNode
// Emitter centerOfGravity position
CGPoint centerOfGravity; //粒子重力原点。
// Position variance
CGPoint posVar; //B粒子喷发原点的宽高变化范围。
// The angle (direction) of the particles measured in degrees
float angle; //A粒子喷发角度
// Angle variance measured in degrees;
float angleVar; //B粒子喷发角度的变化范围
// The speed the particles will have.
float speed; //A粒子运动速度
// The speed variance
float speedVar; //B粒子运动速度的变化范围
// Tangential acceleration
float tangentialAccel; //A粒子切向加速度
// Tangential acceleration variance
float tangentialAccelVar; //B粒子切向加速度的变化范围
// Radial acceleration
float radialAccel; //A粒子径向加速度
// Radial acceleration variance
float radialAccelVar; //B粒子径向加速度变化范围
// start ize of the particles
float startSize; //A粒子起始大小
// start Size variance
float startSizeVar; //B粒子起始大小尺寸变化范围
// End size of the particle
float endSize; //A粒子完毕尺寸
// end size of variance
float endSizeVar; //B粒子完毕尺寸变化范围
// How many seconds will the particle live
float life; //A粒子生命周期
// Life variance
float lifeVar; //B粒子生命周期变化范围
// Start color of the particles
ccColor4F startColor; //A粒子开始颜色
// Start color variance
ccColor4F startColorVar; //B粒子开始颜色变化范围
// End color of the particles
ccColor4F endColor; //A粒子结束颜色
// End color variance
ccColor4F endColorVar; //B粒子结束颜色变化范围
// start angle of the particles
float startSpin; //A粒子开始自旋角度
// start angle variance
float startSpinVar; //B粒子开始自旋角度变化范围
// End angle of the particle
float endSpin; //A粒子结束自旋角度
// end angle ariance
float endSpinVar; //B粒子结束自旋角度变化范围
// Array of particles
Particle *particles;
// Maximum particles
int totalParticles;
// Count of active particles
int particleCount;
// additive color or blend
BOOL blendAdditive;
// color modulate
BOOL colorModulate;
// How many particles can be emitted per second
float emissionRate; //粒子喷发速率
float emitCounter;
// Texture of the particles
CCTexture2D *texture_;
// blend function
ccBlendFunc blendFunc_;
// movment type: free or grouped
tPositionType positionType_;
// Whether or not the node will be auto-removed when there are not particles
BOOL autoRemoveOnFinish_;
// particle idx
int particleIdx;
}
通过以上定义我们可以看到,A类属性定义了整个粒子系统的宏观特性,B类属性定义了粒子微观特性,B类属性是由粒子系统在生成每一个微观粒子时通过随机函数CCRANDOM_MINUS1_1随机赋予的,一旦被激活,就可以模拟整个系统的随机、混乱的效果。
粒子和发射器对象描述了一个粒子系统的复杂性的全部属性,我们还可以根据自己游戏设计内容,通过增加新的A、B类属性来增加上述复杂性:闪烁、随机扰动等等。