这是一个基于D3D的基本的粒子系统,能够实现一些基本的效果,如:雨、雪、烟花等。代码很少,只有一个头文件和一个CPP文件,便于研究粒子系统的原理。
EpParticleSystem.h:
#ifndef _EPPARTICLESYSTEM_H_
#define _EPPARTICLESYSTEM_H_
#include
#include
struct EpParticle
{
D3DXVECTOR3 pos ;
float psize ;
D3DCOLORVALUE color ;
D3DXVECTOR3 velo ;
};
struct stParticleVertex
{
D3DVECTOR pos ;
float psize ;
D3DCOLOR color ;
};
#define D3DFVF_PARTICLE (D3DFVF_XYZ | D3DFVF_PSIZE | D3DFVF_DIFFUSE)
//生成随机数
inline float rangeRand ( float min , float max );
//float->DWORD
inline DWORD FtoDW ( float val ) { return * (( DWORD * ) & val ); }
class EpParticleSystem
{
public :
EpParticleSystem ( D3DVECTOR position , D3DVECTOR range , D3DVECTOR acceleration ,
D3DVECTOR emitterPositionMin , D3DVECTOR emitterPositionMax ,
D3DVECTOR velocityMin , D3DVECTOR velocityMax ,
D3DCOLORVALUE colorMin , D3DCOLORVALUE colorMax ,
float psizeMin , float psizeMax ,
int maxCount , int emitCount , float emitInterval ,
LPDIRECT3DDEVICE9 device , LPDIRECT3DTEXTURE9 texture );
virtual ~ EpParticleSystem ();
bool Initialize ();
void Update ( float delta );
bool Render ();
protected :
void emit ( int emitCount );
protected :
D3DXVECTOR3 m_Pos ; //位置
D3DXVECTOR3 m_Range ; //范围
D3DXVECTOR3 m_Accel ; //加速度
D3DXVECTOR3 m_EmiPosMin , m_EmiPosMax ; //发射器位置
D3DXVECTOR3 m_VeloMin , m_VeloMax ; //粒子速度
D3DCOLORVALUE m_ColorMin , m_ColorMax ; //颜色
float m_PSizeMin , m_PSizeMax ; //粒子大小
int m_Count , m_MaxCount ; //粒子数量及上限
int m_EmiCount ; float m_EmiInterval ; //发射数量,发射间隔时间
float m_Interval ; //累计时间
EpParticle * m_Particles ; //粒子池
LPDIRECT3DDEVICE9 m_pDevice ; //设备对象
LPDIRECT3DTEXTURE9 m_pTexture ; //纹理
LPDIRECT3DVERTEXBUFFER9 m_pVB ; //顶点缓冲区
D3DXMATRIX m_WorldMat ; //世界转换矩阵
};
#endif
EpParticleSystem.cpp:
#include "EpParticleSystem.h"
#include
#include
EpParticleSystem :: EpParticleSystem ( D3DVECTOR position , D3DVECTOR range ,
D3DVECTOR acceleration , D3DVECTOR emitterPositionMin , D3DVECTOR emitterPositionMax ,
D3DVECTOR velocityMin , D3DVECTOR velocityMax , D3DCOLORVALUE colorMin ,
D3DCOLORVALUE colorMax , float psizeMin , float psizeMax ,
int maxCount , int emitCount , float emitInterval ,
LPDIRECT3DDEVICE9 device , LPDIRECT3DTEXTURE9 texture )
{
m_Pos = position ;
m_Range = range ;
m_Accel = acceleration ;
m_EmiPosMin = emitterPositionMin ;
m_EmiPosMax = emitterPositionMax ;
m_VeloMin = velocityMin ;
m_VeloMax = velocityMax ;
m_ColorMin = colorMin ;
m_ColorMax = colorMax ;
m_PSizeMin = psizeMin ;
m_PSizeMax = psizeMax ;
m_Count = 0 ;
m_MaxCount = maxCount ;
m_EmiCount = emitCount ;
m_EmiInterval = emitInterval ;
m_Interval = 0.0f ;
m_pDevice = device ;
m_pTexture = texture ;
m_Particles = NULL ;
m_pVB = NULL ;
//随机数种子
srand ( ( unsigned ) time ( NULL ) );
//计算世界矩阵
D3DXMatrixTranslation ( & m_WorldMat , m_Pos . x , m_Pos . y , m_Pos . z );
}
<