資源簡介
一個基于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? {
//改變粒子的速度與位置
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? {
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
評論
共有 條評論