上面我们完成了一个粒子类的创建,从粒子类中可以看到,每一个粒子是处在一个粒子系统中的,所有粒子的行为都受到粒子系统的影响。下面再来看粒子系统类的构造。
//粒子系统类的定义
class CParticleSystem
{
private:
bool mAttracting; // 粒子系统是否对粒子产生引力
bool mStopped; // 粒子是否停止了发射
unsigned int mTexture; //粒子纹理
unsigned int mParticlesPS; // 每秒发射出的粒子数
unsigned int mParticlesAlive; // 当前存活的粒子数
float mAge; //系统的当前生命,和粒子是两回事
float mLastTimeUpdate; // 系统上次更新时间
float mEmissionResidue;
public:
CParticle particle[MAX_PARTICLES]; //所有的粒子
// VERTEX3D是一个很简单的表示三维坐标点的类
VERTEX3D mPreviousLocation; //系统上一次的位置
VERTEX3D mCurrentLocation; //系统的当前已知位置
VECTOR3D mVelocity; //系统的当前速度
float mStartSize; //粒子的开始大小
float mSizeCounter; //粒子大小变化计数器
float mEndSize; //粒子的最大的大小
float mStartAlpha; //粒子的开始透明度
float mAlphaCounter;
float mEndAlpha; //粒子的最大透明度
VECTOR3D mStartColor;
VECTOR3D mColorCounter;
VECTOR3D mEndColor;
float mSpeed; //系统的速度
float mSpeedCounter; //系统速度计数器
float mLife; //系统的生命
float mLifeCounter; //系统生命计数器
float angle; //粒子系统的角度,90表示半球面,//180表示整个球面。
int mSpreadMin; //用于沿着粒子发射器对粒子随机定位
int mSpreadMax;
float mSpreadFactor;
VECTOR3D mGravity; //X、Y、Z方向上的重力加速度
float mAttractionPercent; //引力百分比
bool Update(float time, int flag, float num_to_create);
void Render(GLvoid);
unsigned int ActiveParticles(void);
float GetLocation(int coordinate);
void SetLocation(float x, float y, float z);
void SetTexture(GLuint texture);
void SetParticlesPerSec(unsigned int number);
void SetVelocity(float xv, float yv, float zv);
void SetSize(float startsize, float endsize);
void SetAlpha(float startalpha, float endalpha);
void SetSpeed(float Speed);
void SetAngle(float half_angle);
void SetSystemFlag(int flag, bool state);
void SetColor(float red1, float green1, float blue1, float red2, float green2, float blue2);
void SetLife(float seconds);
void SetSpread(int SpreadMin, int SpreadMax, float SpreadFactor);
void SetAttraction(unsigned int Attraction_Percent);
void SetGravity(float xpull, float ypull, float zpull);
bool IsAttracting(void){ return mAttracting; }
bool IsStopped(void){ return mStopped; }
CParticleSystem();
~CParticleSystem();
};