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

📄 particle.h

📁 HGE 2D游戏引擎制作的一个演示
💻 H
字号:
/**********************************************
					粒子类
**********************************************/
#pragma once
#include "GUI.h"

#define MAX_PARTICLES	500
#define MAX_PSYSTEMS	100

struct st_Particle
{
	GUIVector	m_vecLocation;				// 粒子位置
	GUIVector	vecVelocity;				// 粒子移动速度

	float		fGravity;					// 粒子重力
	float		fRadialAccel;				// 中心加速度
	float		fTangentialAccel;			// 光线加速度

	float		fSpin;						// 粒子旋转弧度
	float		fSpinDelta;					// 粒子旋转弧度增量

	float		fSize;						// 粒子大小
	float		fSizeDelta;					// 粒子大小增量

	GUIColor	colColor;					// 粒子的颜色(带alpha)
	GUIColor	colColorDelta;				// 粒子的颜色增量

	float		m_fAge;						// 生命周期
	float		fTerminalAge;				// 结束生命周期
};

struct st_ParticleSystemInfo				//粒子系统信息
{
	RenderSprite*	pSprite;				//指向用于渲染粒子的RenderSprite,大部分sprite的参数都是由纹理,混合模式和锚点构成的.

	int				nEmission;				//粒子每一秒的发射数量,注意粒子的最大数量是同时允许500个粒子系统成为一体.如果数量超过,新的粒子将不会创造直到当前的一些粒子死亡.
											//同时存活的粒子的数量依赖于nEmission,fParticleLifeMin 和 fParticleLifeMax 成员.

	float			fLifetime;				//粒子系统发射粒子的时间的周期.当自调用启动方法以后的时间的总计是已经被传递的,粒子将不会再更多的发射.
											//如果 =-1.0f 粒子系统保持发射状态直到手动停止.

	float			fParticleLifeMin;		//特殊的粒子的最小的生命周期.
	float			fParticleLifeMax;		//特殊的粒子的最大的生命周期.

	float			fDirection;				//弧度,是用来定义粒子发射的方向的.

	float			fSpread;				//弧度,是用来定义粒子发射的内部的区域的.
											//例如:如果这个值为0.5,粒子发射的方向位于fDirection-0.5 和 fDirection+0.5之间.
											//如果fSpread是2*pi,fDirection参数变为无意义的被当作一个整圆来看待.

	bool			bRelative;				//如果为真,fDirection成员是相对于当前粒子系统运动方向是经过处理的.
											//如果为假,fDirection成员是完全处理过的(0表示真).

	float			fSpeedMin;				//特殊粒子最小的开始速率.
	float			fSpeedMax;				//特殊粒子最大的开始速率.

	float			fGravityMin;			//特殊粒子的最小重力值(重力基本上就是沿着Y轴的加速度).
	float			fGravityMax;			//特殊粒子的最大重力值(重力基本上就是沿着Y轴的加速度).

	float			fRadialAccelMin;		//特殊粒子的关于粒子中心加速度的最小值.	
	float			fRadialAccelMax;		//特殊粒子的关于粒子中心加速度的最大值.

	float			fTangentialAccelMin;	//特殊粒子的与光线加速度垂直的加速度的最小值.
	float			fTangentialAccelMax;	//特殊粒子的与光线加速度垂直的加速度的最大值.

	float			fSizeStart;				//特殊粒子的开始时的缩放比例(1.0是默认RenderSprite的尺寸).
	float			fSizeEnd;				//特殊粒子的终止时的缩放比例(1.0是默认RenderSprite的尺寸).
	float			fSizeVar;				//开始时的缩放比例从0.0(意味着没有变化)到1.0(意味着从fSizeStart到 fSizeEnd随意变化).

	float			fSpinStart;				//特殊粒子的开始时的旋转的弧度.
	float			fSpinEnd;				//特殊粒子的结束时的旋转的弧度.
	float			fSpinVar;				//开始时的旋转从0.0(意味着没有变化)到1.0(意味着从fSpinStart 到 fSpinEnd随意变化).

	GUIColor		colColorStart;			//特殊粒子的开始时的颜色及透明度.
	GUIColor		colColorEnd;			//特殊粒子的结束时的颜色及透明度.
	float			fColorVar;				//开始时的颜色从0.0(意味着没有变化)到1.0(意味着从开始到结束随意变化颜色).
	float			fAlphaVar;				//开始时的透明度从0.0(意味着没有变化)到1.0(意味着从开始到结束随意变化透明度).
};

class ParticleSystem :
	public BaseObject
{
public:
	st_ParticleSystemInfo m_PSInfo;

	ParticleSystem(CORE* pCORE,const char *filename, RenderSprite *sprite, float fps=0.0f);
	ParticleSystem(CORE* pCORE,st_ParticleSystemInfo *psi, float fps=0.0f);
	ParticleSystem(CORE* pCORE,const ParticleSystem &ps);
	~ParticleSystem() {}

	ParticleSystem&	operator= (const ParticleSystem &ps);

	void				Render();
	void				FireAt(float x, float y);
	void				Fire();
	void				Stop(bool bKillParticles=false);
	void				Update(float fDeltaTime);
	void				MoveTo(float x, float y, bool bMoveParticles=false);
	void				Transpose(float x, float y);
	void				TrackBoundingBox(bool bTrack);

	int					GetParticlesAlive() const;
	float				GetAge() const;
	void				GetPosition(float *x, float *y) const;
	void				GetTransposition(float *x, float *y) const;
	GUIRect*			GetBoundingBox(GUIRect *rect) const;

private:
	ParticleSystem();
	void				_update(float fDeltaTime);

	CORE*				m_pCORE;

	float				m_fUpdSpeed;
	float				m_fResidue;

	float				m_fAge;
	float				m_fEmissionResidue;

	GUIVector			m_vecPrevLocation;
	GUIVector			m_vecLocation;
	float				m_fTx, m_fTy;

	int					m_nParticlesAlive;
	GUIRect				m_rectBoundingBox;
	bool				m_bUpdateBoundingBox;

	st_Particle			m_particles[MAX_PARTICLES];
};

class ParticleManager :
	public BaseObject
{
public:
	ParticleManager(CORE* pCORE,float fps=0.0f);
	~ParticleManager();

	void				Update(float dt);
	void				Render();

	ParticleSystem*	SpawnPS(st_ParticleSystemInfo *psi, float x, float y);
	bool				IsPSAlive(ParticleSystem *ps) const;
	void				Transpose(float x, float y);
	void				GetTransposition(float *dx, float *dy) const;
	void				KillPS(ParticleSystem *ps);
	void				KillAll();

private:
	ParticleManager(const ParticleManager &);
	ParticleManager&	operator= (const ParticleManager &);

	CORE*				m_pCORE;
	float				m_fFPS;
	int					m_nPS;
	float				m_tX;
	float				m_tY;
	ParticleSystem*	m_psList[MAX_PSYSTEMS];
};

⌨️ 快捷键说明

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