📄 psystem.h
字号:
//////////////////////////////////////////////////////////////////////////////////////////////////
//
// File: pSystem.h
//
// Author: Frank Luna (C) All Rights Reserved
//
// System: AMD Athlon 1800+ XP, 512 DDR, Geforce 3, Windows XP, MSVC++ 7.0
//
// Desc: Represents a geneal particle system.
//
//////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef __pSystemH__
#define __pSystemH__
#include "d3dUtility.h"
#include "camera.h"
#include <list>
namespace psys
{
struct Particle
{
D3DXVECTOR3 _position;
D3DCOLOR _color;
static const DWORD FVF;
};
struct Attribute
{
Attribute()
{
_lifeTime = 0.0f;
_age = 0.0f;
_isAlive = true;
}
D3DXVECTOR3 _position;
D3DXVECTOR3 _velocity;
D3DXVECTOR3 _acceleration;
float _lifeTime; // how long the particle lives for before dying
float _age; // current age of the particle
D3DXCOLOR _color; // current color of the particle
D3DXCOLOR _colorFade; // how the color fades with respect to time
bool _isAlive;
};
class PSystem
{
public:
PSystem();
virtual ~PSystem();
virtual bool init(IDirect3DDevice9* device, char* texFileName);
virtual void reset();
// sometimes we don't want to free the memory of a dead particle,
// but rather respawn it instead.
virtual void resetParticle(Attribute* attribute) = 0;
virtual void addParticle();
virtual void update(float timeDelta) = 0;
virtual void preRender();
virtual void render();
virtual void postRender();
bool isEmpty();
bool isDead();
protected:
virtual void removeDeadParticles();
protected:
IDirect3DDevice9* _device;
D3DXVECTOR3 _origin;
d3d::BoundingBox _boundingBox;
float _emitRate; // rate new particles are added to system
float _size; // size of particles
IDirect3DTexture9* _tex;
IDirect3DVertexBuffer9* _vb;
std::list<Attribute> _particles;
int _maxParticles; // max allowed particles system can have
//
// Following three data elements used for rendering the p-system efficiently
//
DWORD _vbSize; // size of vb
DWORD _vbOffset; // offset in vb to lock
DWORD _vbBatchSize; // number of vertices to lock starting at _vbOffset
};
class Snow : public PSystem
{
public:
Snow(d3d::BoundingBox* boundingBox, int numParticles);
void resetParticle(Attribute* attribute);
void update(float timeDelta);
};
class Firework : public PSystem
{
public:
Firework(D3DXVECTOR3* origin, int numParticles);
void resetParticle(Attribute* attribute);
void update(float timeDelta);
void preRender();
void postRender();
};
class ParticleGun : public PSystem
{
public:
ParticleGun(Camera* camera);
void resetParticle(Attribute* attribute);
void update(float timeDelta);
private:
Camera* _camera;
};
}
#endif // __pSystemH__
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -