📄 game_particle.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 + -