📄 particle.h
字号:
/**********************************************
粒子类
**********************************************/
#pragma once
#include "GUI.h"
#define MAX_PARTICLES 500
#define MAX_PSYSTEMS 100
struct st_Particle
{
GUIVector m_vecLocation; // 粒子位置
GUIVector vecVelocity; // 粒子移动速度
float fGravity; // 粒子重力
float fRadialAccel; // 中心加速度
float fTangentialAccel; // 光线加速度
float fSpin; // 粒子旋转弧度
float fSpinDelta; // 粒子旋转弧度增量
float fSize; // 粒子大小
float fSizeDelta; // 粒子大小增量
GUIColor colColor; // 粒子的颜色(带alpha)
GUIColor colColorDelta; // 粒子的颜色增量
float m_fAge; // 生命周期
float fTerminalAge; // 结束生命周期
};
struct st_ParticleSystemInfo //粒子系统信息
{
RenderSprite* pSprite; //指向用于渲染粒子的RenderSprite,大部分sprite的参数都是由纹理,混合模式和锚点构成的.
int nEmission; //粒子每一秒的发射数量,注意粒子的最大数量是同时允许500个粒子系统成为一体.如果数量超过,新的粒子将不会创造直到当前的一些粒子死亡.
//同时存活的粒子的数量依赖于nEmission,fParticleLifeMin 和 fParticleLifeMax 成员.
float fLifetime; //粒子系统发射粒子的时间的周期.当自调用启动方法以后的时间的总计是已经被传递的,粒子将不会再更多的发射.
//如果 =-1.0f 粒子系统保持发射状态直到手动停止.
float fParticleLifeMin; //特殊的粒子的最小的生命周期.
float fParticleLifeMax; //特殊的粒子的最大的生命周期.
float fDirection; //弧度,是用来定义粒子发射的方向的.
float fSpread; //弧度,是用来定义粒子发射的内部的区域的.
//例如:如果这个值为0.5,粒子发射的方向位于fDirection-0.5 和 fDirection+0.5之间.
//如果fSpread是2*pi,fDirection参数变为无意义的被当作一个整圆来看待.
bool bRelative; //如果为真,fDirection成员是相对于当前粒子系统运动方向是经过处理的.
//如果为假,fDirection成员是完全处理过的(0表示真).
float fSpeedMin; //特殊粒子最小的开始速率.
float fSpeedMax; //特殊粒子最大的开始速率.
float fGravityMin; //特殊粒子的最小重力值(重力基本上就是沿着Y轴的加速度).
float fGravityMax; //特殊粒子的最大重力值(重力基本上就是沿着Y轴的加速度).
float fRadialAccelMin; //特殊粒子的关于粒子中心加速度的最小值.
float fRadialAccelMax; //特殊粒子的关于粒子中心加速度的最大值.
float fTangentialAccelMin; //特殊粒子的与光线加速度垂直的加速度的最小值.
float fTangentialAccelMax; //特殊粒子的与光线加速度垂直的加速度的最大值.
float fSizeStart; //特殊粒子的开始时的缩放比例(1.0是默认RenderSprite的尺寸).
float fSizeEnd; //特殊粒子的终止时的缩放比例(1.0是默认RenderSprite的尺寸).
float fSizeVar; //开始时的缩放比例从0.0(意味着没有变化)到1.0(意味着从fSizeStart到 fSizeEnd随意变化).
float fSpinStart; //特殊粒子的开始时的旋转的弧度.
float fSpinEnd; //特殊粒子的结束时的旋转的弧度.
float fSpinVar; //开始时的旋转从0.0(意味着没有变化)到1.0(意味着从fSpinStart 到 fSpinEnd随意变化).
GUIColor colColorStart; //特殊粒子的开始时的颜色及透明度.
GUIColor colColorEnd; //特殊粒子的结束时的颜色及透明度.
float fColorVar; //开始时的颜色从0.0(意味着没有变化)到1.0(意味着从开始到结束随意变化颜色).
float fAlphaVar; //开始时的透明度从0.0(意味着没有变化)到1.0(意味着从开始到结束随意变化透明度).
};
class ParticleSystem :
public BaseObject
{
public:
st_ParticleSystemInfo m_PSInfo;
ParticleSystem(CORE* pCORE,const char *filename, RenderSprite *sprite, float fps=0.0f);
ParticleSystem(CORE* pCORE,st_ParticleSystemInfo *psi, float fps=0.0f);
ParticleSystem(CORE* pCORE,const ParticleSystem &ps);
~ParticleSystem() {}
ParticleSystem& operator= (const ParticleSystem &ps);
void Render();
void FireAt(float x, float y);
void Fire();
void Stop(bool bKillParticles=false);
void Update(float fDeltaTime);
void MoveTo(float x, float y, bool bMoveParticles=false);
void Transpose(float x, float y);
void TrackBoundingBox(bool bTrack);
int GetParticlesAlive() const;
float GetAge() const;
void GetPosition(float *x, float *y) const;
void GetTransposition(float *x, float *y) const;
GUIRect* GetBoundingBox(GUIRect *rect) const;
private:
ParticleSystem();
void _update(float fDeltaTime);
CORE* m_pCORE;
float m_fUpdSpeed;
float m_fResidue;
float m_fAge;
float m_fEmissionResidue;
GUIVector m_vecPrevLocation;
GUIVector m_vecLocation;
float m_fTx, m_fTy;
int m_nParticlesAlive;
GUIRect m_rectBoundingBox;
bool m_bUpdateBoundingBox;
st_Particle m_particles[MAX_PARTICLES];
};
class ParticleManager :
public BaseObject
{
public:
ParticleManager(CORE* pCORE,float fps=0.0f);
~ParticleManager();
void Update(float dt);
void Render();
ParticleSystem* SpawnPS(st_ParticleSystemInfo *psi, float x, float y);
bool IsPSAlive(ParticleSystem *ps) const;
void Transpose(float x, float y);
void GetTransposition(float *dx, float *dy) const;
void KillPS(ParticleSystem *ps);
void KillAll();
private:
ParticleManager(const ParticleManager &);
ParticleManager& operator= (const ParticleManager &);
CORE* m_pCORE;
float m_fFPS;
int m_nPS;
float m_tX;
float m_tY;
ParticleSystem* m_psList[MAX_PSYSTEMS];
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -