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

📄 game_particle.h

📁 我做的毕业设计
💻 H
字号:
//Particle的头文件
#ifndef PARTICLE_H_INCLUDED
#define PARTICLE_H_INCLUDED



inline DWORD FtoDW( FLOAT f ) { return *((DWORD*)&f); }

#define	EMITTERTYPE_PLANAR_QUADRATE		0x01
#define	EMITTERTYPE_PLANAR_ROUND		0x02
#define	EMITTERTYPE_CUBLIC				0x11
#define	EMITTERTYPE_BALL				0x12

//粒子系统的类
class CParticleSystem
{
protected:

	struct POINTVERTEX   
	{
		D3DXVECTOR3 v;     
		D3DCOLOR    color;
		static const DWORD FVF;
	};

	struct PARTICLE
	{
		D3DXVECTOR3 m_vPos;       // 当前位置
		D3DXVECTOR3 m_vVel;       // 当前速度

		D3DXVECTOR3 m_vPos0;      // 初始位置
		D3DXVECTOR3 m_vVel0;      // 初始速度

		FLOAT       m_fTime0;     // 创建时间
		FLOAT       m_fFade;      //退色
		DWORD		m_clrEmit;	  //发射粒子
		DWORD		m_clrFade;	  //
		PARTICLE*   m_pNext;      // 下一个粒子

		BOOL		m_bMove;

	};

protected:
	float	  m_fGravity;	//加速度
	float	  m_fParticleLife;
	float	  m_fParticleFade;
	float	  m_EmitRate;	//发射速率
	float	  m_EmitVel;	//初始速度
	float	  m_EmitAngle;	//发射的角度
	float	  m_EmitWidth;
	float	  m_fParticleSize;
    float	  m_fTime;

	DWORD	  m_dwType;

    DWORD     m_dwBase;		//当前使用的是缓冲区中的第几个顶点
	DWORD     m_dwFlush;	//顶点小块的大小,每次渲染这一小块
    DWORD     m_dwDiscard;	//顶点数量

    DWORD     m_dwParticles;	//粒子数量
    DWORD     m_dwParticlesLim;	//粒子数量限制
	
	DWORD		m_clrEmit;
	DWORD		m_clrFade;

	D3DXVECTOR3 m_vPosition;	//位置,世界坐标的位置,
	D3DXVECTOR3 m_vDirection;	//方向
	D3DXVECTOR3	m_vIntersectPoint;	//目标点
	float					m_fYaw;				
	float					m_fPitch;

    PARTICLE* m_pParticles;		//活动粒子链表
    PARTICLE* m_pParticlesFree;	//消亡粒子链表

    // Geometry
    LPDIRECT3DVERTEXBUFFER9 m_pVB;	//顶点缓冲区指针
	LPDIRECT3DDEVICE9	m_pDevice;	//设备
	LPDIRECT3DTEXTURE9	m_pTexture;	//纹理

public:
	bool					m_bMoving;			//粒子活动状态
	bool					m_bLive;			//粒子产生状态
	DWORD					m_dwAttackNum;		//MagicPOPO攻击力
	DWORD					m_dwMagicNum;		//消耗

public:
	CParticleSystem(LPDIRECT3DDEVICE9 pDevice,char *strTexture);

   ~CParticleSystem();

    HRESULT RestoreDeviceObjects();
    HRESULT InvalidateDeviceObjects();
    HRESULT Update( float fSecsPerFrame);
	HRESULT Update2( float fSecsPerFrame);
    HRESULT Render(float tFrame,D3DXVECTOR3 * IntersectPoint);
	void	SetType(DWORD Type, float size) {m_dwType = Type;m_fParticleSize = size;}
	float	GetYaw() {return m_fYaw;}
	void SetPosition(D3DXVECTOR3 *pV) {m_vPosition=*pV;m_vPosition.y +=50;}
		//求2点之间平面的距离
	float	DistanceXZOfTwoVec3(const D3DXVECTOR3 v1, const D3DXVECTOR3 v2)
	{
		float x,z,distXZ;
		x = v1.x - v2.x;
		z = v1.z - v2.z;
		distXZ = sqrt(x*x + z*z); 
		return distXZ;
	}

	//求2点之间的距离
	float	DistanceOfTowVec3(const D3DXVECTOR3 v1, const D3DXVECTOR3 v2, float distXZ)
	{
		float y, dist;
		y = v1.y - v2.y;
		dist = sqrt(y * y + distXZ * distXZ);
		return dist;
	}

	//求2点间线段与坐标系平面夹角
	float	GetYaw(const D3DXVECTOR3 v1, const D3DXVECTOR3 v2)
	{
		float x,alpha,z, distXZ;
		x = v1.x - v2.x;
		z = v1.z - v2.z;
		distXZ = DistanceXZOfTwoVec3(v1, v2);
		if(distXZ == 0)
			return 0;
		else
			alpha = asin(z/distXZ);
		if(abs(alpha) <= MINFLOAT)
		{
			if(x > 0)
				return D3DX_PI/2;
			else if(x < 0)
				return -D3DX_PI/2;
		}
		if(x > 0)
			return D3DX_PI/2 - alpha;
		else
			return alpha - D3DX_PI/2;
	}

	//求2点之间的仰角
	float	GetPitch(const D3DXVECTOR3 v1, const D3DXVECTOR3 v2)
	{
		float x, y, z, distXZ, dist, alpha;
		x = v1.x - v2.x;
		y = v1.y - v2.y;
		z = v1.z - v2.z;
		distXZ = DistanceXZOfTwoVec3(v1, v2);
		dist = DistanceOfTowVec3(v1, v2, distXZ);
		if(y == 0)
			return 0;
		else if(dist == 0)
		{
			if(v1.y > v2.y)
				alpha = D3DX_PI / 2;
			else
				alpha = -D3DX_PI / 2;
		}
		else
		{
			alpha = asin(y / dist);
		}
		return alpha;
	}
	void SetYawPitch(float yaw,float pitch)
	{	
		m_vDirection= 
			D3DXVECTOR3(cosf(pitch)*sinf(yaw),
						sinf(pitch),
						cosf(pitch)*cosf(yaw));
	}

	HRESULT LoadFromFile(char* strFile,char *strSection);
	bool MoveTo(D3DXVECTOR3 IntersectPoint,D3DXVECTOR3 * vPosition,float tFrameTime, float Speed);

	DWORD	ColorLerp(DWORD color1,DWORD color2,float fWeight)
	{
		if(fWeight<=0.01f) return color1;
		else if(fWeight>=1) return color2; 
		else
		{	
			BYTE Weight=(BYTE)(fWeight*255);
			BYTE IWeight=~Weight;
			DWORD dwTemp=0;
			dwTemp =(((0xFF00FF00&color1)>>8)*IWeight+ 
				     ((0xFF00FF00&color2)>>8)*Weight
				    )&0xFF00FF00;

			dwTemp|=(((0x00FF00FF&color1)*IWeight+
				      (0x00FF00FF&color2)*Weight
				     )&0xFF00FF00)>>8; 
			return dwTemp;
		}

	}

	DWORD StrOct(char *str)
	{
		int i;
		DWORD dwTemp=0;
		for(i=2;str[i]!=0 && i<10;i++)
		{
			dwTemp<<=4;
			dwTemp|=(0x0F & str[i]) + ((str[i]& 0x40)>>6)*9; 
		}
		return dwTemp;
	}



};
#endif	

⌨️ 快捷键说明

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