⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 particleemitter.h

📁 这是一款游戏中的粒子系统
💻 H
字号:
#pragma once

#include "BaseHeader.h"
#include "ParticleAffector.h"
#include "ParticleSystem.h"
#include "Particle.h"
//发射器
// 一个渲染池最大具有512个粒子发射池
#define	MAX_PARTICLE_POOL_LENGTH	512
// 最大只允许一个Emitter同时存在1024个粒子
#define	MAX_EMIT_NUMBER				1024

class CParticleEmitter
{
public:
	struct _UV
	{
		float u;
		float v;
	};

	struct Vert_PDT1{
		enum{
			fvf		= D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1,
		};
		D3DVECTOR		pos;
		DWORD			clr;
		_UV				tex;
	};

public:
	CParticleEmitter(LPDIRECT3DDEVICE9  device,CParticleSystem* sys , const string& name , long maxparticle , long emit_ps , float spd , float size , D3DCOLOR clr );
	~CParticleEmitter();
	void	InitEmitIB();
	/// 粒子队列
	typedef	list<CParticle*>	ParticleList;
	typedef	vector<CParticle*>	ParticleVector;
public:
	/** 后备粒子池 */
	ParticleList	m_DisableList;
	/** Active粒子池 */
	ParticleList	m_ActiveList;
	/** 总粒子池 */
	ParticleVector	m_ParticlePool;
	/** 粒子数据 */
	Vert_PDT1		m_PartDatas[MAX_EMIT_NUMBER*4];
	LPDIRECT3DVERTEXBUFFER9 m_vb;
	LPDIRECT3DINDEXBUFFER9  m_ib;
	LPDIRECT3DDEVICE9       m_pDevice;
	LPDIRECT3DTEXTURE9      m_pTexture;
	char*                  m_textureName;
public:
	/** 父System */
	CParticleSystem*m_pParentSystem;
	string			m_strName;
	/** 相对System的位置,实际位置由相对位置和System本身的位置共同算出 */
	D3DXVECTOR3		m_vecRelPos;
	/** 是否被激活 */
	bool			m_bActive;
	/** 单次发射的延续时间 */
	float			m_fElapsedTime;
	/** 最大容许粒子数,这个值会受 MAX_EMIT_NUMBER 限制 */
	long			m_un32MaxParticleNum;
	/** 发射多少时间后失效,0永恒发射(取值范围) */
	float			m_fMaxEmitTime;
	float			m_fMaxEmitTimeMin;
	float			m_fMaxEmitTimeVar;
	/** 失效后多长时间重新启动(取值范围) */
	float			m_fRepeatDelay;
	float			m_fRepeatDelayMin;
	float			m_fRepeatDelayVar;
	/// 基本状态
	/**	粒子发射速率影响子
	*	如无特殊,常时发射
	*	如有特殊的发射速率需要,比如间隔发射、随机速率发射等等,可挂接已注册的特殊的速率影响子
	*/
	/** 每秒钟发射粒子数量 */
	long			m_un32EmitNumPerSec;
	/** 内部变量,粒子发射的累积 */
	float			m_fEmitAccum;
	/** 位置影响子
	*	如无特殊,一般是指点影响子
	*	如有特殊位置需要,比如Box、Circle、Cylinder、Sphere、Plane、Line、Curve,可挂接已注册的特殊的影响子。
	*/
	D3DXVECTOR3		m_vecLastPos;
	D3DXVECTOR3		m_vecPos;
	/** 位置配置是否需要插值 */
	bool			m_bInterpolation;
	D3DXVECTOR3		m_vecInterpolatePos;
	/** 速度(取值范围) */
	D3DXVECTOR3		m_vecVelocityMin;
	D3DXVECTOR3		m_vecVelocityVar;
	/// 基本产生项目
	/** 大小(取值范围) */
	float			m_fInitSizeMin;
	float			m_fInitSizeVar;
	/** 最大生命值(取值范围) */
	float			m_fLifeSpanMin;
	float			m_fLifeSpanVar;
	/** 初始颜色(取值范围) */
	union
	{
		D3DCOLOR		m_clrInitClrMin;
		struct { UCHAR	m_InitBMin , m_InitGMin , m_InitRMin , m_InitAMin; };
	};
	union
	{
		D3DCOLOR		m_clrInitClrVar;
		struct { UCHAR	m_InitBVar , m_InitGVar , m_InitRVar , m_InitAVar; };
	};

	/// 影响子项目
	// 对粒子产生时状态进行改变,如前面所列举的位置、方向、大小等等配置子
	//
	// 对运行时粒子状态进行改变,可能包括下面三种
	// 色彩扰动因子
	// 无此是线性取值
	// 可能的选项有:离散取值或者闪烁
	//
	// 粒子外力状态的扰动因子
	// 无此是无加速度的匀速运动
	// 可能的选项有:指向某点的线性外力运动、非线性外力运动
	//
	// 粒子速度运动状态的扰动因子
	// 无此则没有速度变化
	// 可能的选项有:雪花(横向随机扰动)、螺旋运动(横向旋转扰动)等
	//
	///	实际上,只要是粒子状态,原理上,都可以被影响
	///	注意这里的扰动和Affector(影响器)的作用还不同,这里的扰动只是描述了单一Emitter的行为,既不能影响PS,更不能影响其他Emitter。
	///	影响器描述的则是整个场景中的全局影响,它可以影响处于其影响范围内的所有PS。
	typedef	vector<CParticleAffector*>	AffectorVector;
	AffectorVector	m_AffectorVector;
	
public:

	string& GetName()
	{ return m_strName; }

	D3DXVECTOR3& GetAbsPosition()
	{ return m_vecPos; }

	bool GetActive()
	{ return m_bActive; }

	void SetPosInterpolation( bool setting )
	{ m_bInterpolation = setting; }

	bool GetPosInterpolation()
	{ return m_bInterpolation; }

	const D3DXVECTOR3&	GetInterpolatePos()
	{ return m_vecInterpolatePos; }

	float RangeRandom ( float fLow , float fHigh )
	{return ( fHigh - fLow ) * (float(rand()) / float(RAND_MAX)) + fLow;}
public:
	virtual	void	UpdateMatrix();
	/** 按设置生成粒子 */
	virtual	bool	Initialize();
	/** 生成粒子 */
	virtual	void	Generate( float fElapsed );
	virtual	void	GenerateSize( CParticle* particle );
	virtual	void	GenerateVelocity( CParticle* particle );
	virtual	void	GenerateLife( CParticle* particle );
	virtual	void	GenerateColor( CParticle* particle );
	/** 粒子逻辑 */
	virtual	void	Update( float fElapsed );
	virtual	bool	UpdateParticle( float fElapsed , CParticle* particle );
	/** 渲染粒子 */
	virtual	void	Render(D3DXVECTOR3 camDir);
	virtual	void	RenderGeometry();
	/** 销毁本Emitter */
	virtual	void	Destroy();
public:
	//设置粒子系统参数接口
	virtual	void	SetParentSystem( CParticleSystem* sys );
	virtual	void	SetMaxParticleNumber( long num );
	virtual	void	SetEmitRate( long num_ps );
	virtual	void	SetEmitRepeat( float emitmin , float delaymin , float emitvar = 0 , float delayvar = 0 );
	virtual	void	SetRelativePos( const D3DXVECTOR3& rel );
	virtual	void	SetSpeed( const D3DXVECTOR3& spd , const D3DXVECTOR3& var = D3DXVECTOR3(0,0,0) );
	virtual	void	SetSize( float initmin , float initvar = 0 );
	virtual	void	SetLifeSpan( float min , float var = 0 );
	virtual	void	SetColor( const D3DCOLORVALUE& clr , const D3DCOLORVALUE& var = D3DXCOLOR(0,0,0,0) );
	virtual	void	SetColor( D3DCOLOR clr , D3DCOLOR var = 0 );
	virtual	bool	SetTexture(char *texName);
	virtual	void	SetActive( bool setting = true );
	virtual	void	SetPoolSize(unsigned int size);
	virtual void    SetName(string str);
public:
	virtual	void	AddAffector( CParticleAffector* pAffector );//添加影响器
	virtual	void	DestroyPlugs();
};

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -