资源简介

一个基于DirectX3D的粒子系统,包含源文件,和一个烟火的示例。

资源截图

代码片段和文件信息

#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);
}

bool EpParticleSystem::Initialize()
{
if (m_pDevice == NULL)
{
return false;
}
//构建粒子池
m_Particles = new EpParticle[m_MaxCount];
if (m_Particles == NULL)
{
return false;
}
//创建顶点缓冲区
if(FAILED(m_pDevice->CreateVertexBuffer(sizeof(stParticleVertex) * m_MaxCount
D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY | D3DUSAGE_POINTS 
D3DFVF_PARTICLE D3DPOOL_DEFAULT &m_pVB NULL))) 
return false;

return true;
}

void EpParticleSystem::Update( float delta )
{
EpParticle *p = NULL;
for (int i = 0; i < m_Count; i++)
{
//改变粒子的速度与位置
p = &m_Particles[i];
p->pos += p->velo;
p->velo += m_Accel;

//检查粒子是否超出边界
if (!(p->pos.x <= m_Range.x/2 && p->pos.x >= -m_Range.x/2 &&
  p->pos.y <= m_Range.y/2 && p->pos.y >= -m_Range.y/2 && 
  p->pos.z <= m_Range.z/2 && p->pos.z >= -m_Range.z/2 ))
{
//将最后一个粒子移到该位置
m_Particles[i] = m_Particles[m_Count-1];
m_Count--; //抛弃最后一个粒子
i--; //重新检查该粒子
}
}
//发射粒子
m_Interval += delta;
if (m_Interval >= m_EmiInterval)
{
emit(m_EmiCount);
m_Interval -= m_EmiInterval;
}
}
//生成随机数
float rangeRand( float min float max )
{
return (float)rand() / RAND_MAX * (max - min) + min;
}
//发射一定数量的粒子
void EpParticleSystem::emit( int emitCount )
{
EpParticle *p = NULL;
for (int i = 0; i < emitCount; i++)
{
if (m_Count == m_MaxCount) break;
p = &m_Particles[m_Count];
p->pos.x = rangeRand(m_EmiPosMin.x m_EmiPosMax.x);
p->pos.y = rangeRand(m_EmiPosMin.y m_EmiPosMax.y);
p->pos.z = rangeRand(m_EmiPosMin.z m_EmiPosMax.z);
p->velo.x = rangeRand(m_VeloMin.x m_VeloMax.x);
p->velo.y = rangeRand(m_VeloMin.y m_VeloMax.y);
p->velo.z = rangeRand(m_VeloMin.z m_VeloMax.z);
p->psize = rangeRand(m_PSizeMin m_PSizeMax);
p->color.r = rangeRand(m_ColorMin.r m_ColorMax.r);
p->color.g = rangeRand(m_ColorMin.g m_ColorMax.g);
p->color.

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       4850  2009-09-12 14:32  EpParticleSystem.cpp

     文件       1728  2009-09-12 14:32  EpParticleSystem.h

     文件       5035  2009-09-12 14:20  main.cpp

     文件      13349  2006-04-12 02:22  snow.tga

     文件      13824  2009-09-12 16:02  EpParticleSystem.exe

----------- ---------  ---------- -----  ----

                38786                    5


评论

共有 条评论