资源简介
一个基于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
相关资源
- d3d hook模块
- d3drm.dll文件
- tb97ford3d4d5d6d7
- d3d9.dll补丁
- D3D 多物体鼠标拾取
- Direct3D帮助文档
- D3D11程序框架
- D3D11纹理基础
- D3D11绘图基础:旋转的彩色立方体
- D3D11初始化代码
- D3D 坦克大战 源码文件
- D3D8 hook 游戏屏幕写入文字
- 粒子系统 [插件] Environment Weather Effe
- 精通Direct3D图形与动画程序设计 06_第
- D3D11_Pick
- D3D11教程2源码
- processing粒子系统
- D3D12旋转的彩色立方体-更新
- Shader实现的阴影效果(Shadow)
- D3D API函数中文帮助
- d3dx12.h
- d3dx9_39.dll、d3dx9_40.dll、d3dx9_41.dll、d
- D3D11 第一人称摄像机类的实现
- D3D射线碰撞检测简例
- D3D11教程3源码
- Direct3D实现三维漫游
- OpenGL读取3DS文件 CLoad3ds类
- d3dx9_27.dll
- Unity__AvatarUnlitD3D.shader
- 狼队D3D游戏通用人物透视源码
评论
共有 条评论