|
|
发表于 2008-12-13 16:39:00
|
显示全部楼层
Re: 求在MFC框架下,降雨效果的源代码(粒子系统)
写了一个类,你自己看吧
//2008-10-16
//模拟粒子系统效果雨
//李世铭
#pragma once
#define PARTICLENUM 300
//雨点粒子结构
struct RAINVERTEX
{
D3DXVECTOR3 vPos;
DWORD dwColor;
};
#define D3DFVF_RAINVERTEX (D3DFVF_XYZ | D3DFVF_DIFFUSE)
struct RainParticle
{
float x,y,z; //位置;
float fDspeed; //下降速度;
};
class CRain
{
public:
CRain(LPDIRECT3DDEVICE9 pDevice);
~CRain();
HRESULT InitRain(LPDIRECT3DDEVICE9 pDevice);
VOID UpDate(float fElapsedTime);
VOID Render();
VOID CleanUp();
private:
LPDIRECT3DDEVICE9 m_pDevice;
LPDIRECT3DVERTEXBUFFER9 _pRainVB; //雨点粒子顶点缓冲
D3DXMATRIXA16 _matWorld; //雨点世界矩阵
D3DXVECTOR3 _rainDir; //雨点的下降方向
RainParticle rain[PARTICLENUM]; //雨点粒子数组
};
#include "stdafx.h"
CRain::CRain(LPDIRECT3DDEVICE9 pDevice)
{
m_pDevice = pDevice;
_pRainVB = NULL;
}
CRain::~CRain()
{
}
HRESULT CRain::InitRain(LPDIRECT3DDEVICE9 pDevice)
{
//创建雨点顶点缓冲区
if (FAILED(pDevice->CreateVertexBuffer( 2*sizeof(RAINVERTEX),
0, D3DFVF_RAINVERTEX,
D3DPOOL_MANAGED, &_pRainVB, NULL )))
{
return E_FAIL;
}
//填充雨点顶点缓冲区
RAINVERTEX* pRainVerteices;
_pRainVB->Lock(0,0,(void**)&pRainVerteices,0);
pRainVerteices[0].vPos = D3DXVECTOR3(1,4,0);
pRainVerteices[0].dwColor = 0xFFDDDDDD;
pRainVerteices[1].vPos = D3DXVECTOR3(2,1,0);
pRainVerteices[1].dwColor = 0xFFDDDDDD;
_pRainVB->Unlock();
return S_OK;
}
VOID CRain::UpDate(float fElapsedTime)
{
//初始化雨点数组
for (int i=0;i< ARTICLENUM;i++)
{
//rain.x = GetRandFloat(-256,256);
//rain.y = GetRandFloat(0,256);
//rain.z = GetRandFloat(-256,256);
//rain.fDspeed = GetRandFloat(1500,2000);
rain.x = float(rand()%400-200);
rain.z = float(rand()%400-200);
rain.y = float(rand()%250);
rain.fDspeed = 10.0f + (rand()%40);
}
//计算雨点下降方向
//_rainDir = D3DXVECTOR3(GetRandFloat(0,3),0,GetRandFloat(3,8)) - D3DXVECTOR3(GetRandFloat(0,3),GetRandFloat(0,3),0);
_rainDir = D3DXVECTOR3(3, 1, 0) - D3DXVECTOR3(1, 5, 0);;
D3DXVec3Normalize(&_rainDir, &_rainDir);
//计算每个雨点的当前位置
for (int i=0;i<PARTICLENUM;i++)
{
if (rain.y < 0)
{
rain.y = 2000.0f;
}
if (rain.x > 3500)
{
rain.x = GetRandFloat(-50,0);
}
if (rain.z > 3500)
{
rain.z = GetRandFloat(-50,0);
}
rain.x += rain.fDspeed * _rainDir.x *fElapsedTime;
rain.y += rain.fDspeed * _rainDir.y * fElapsedTime;
rain.z += rain.fDspeed * _rainDir.z * fElapsedTime;
}
}
VOID CRain::Render()
{
m_pDevice->SetTexture( 0, NULL );
for (int i=0;i<PARTICLENUM;i++)
{
D3DXMatrixTranslation(&_matWorld, rain.x, rain.y, rain.z);
m_pDevice->SetTransform( D3DTS_WORLD, &_matWorld );
m_pDevice->SetStreamSource(0,_pRainVB,0,sizeof(RAINVERTEX));
m_pDevice->SetFVF(D3DFVF_RAINVERTEX);
m_pDevice->DrawPrimitive(D3DPT_LINELIST,0,1);
}
}
VOID CRain::CleanUp()
{
SAFE_RELEASE(_pRainVB);
SAFE_RELEASE(m_pDevice);
} |
|