📄 particle.cpp
字号:
/******************************************************************************************************************
葛碘疙:
累己磊:
累己老:
[老磊][荐沥磊] : 荐沥 郴侩
*******************************************************************************************************************/
#include "StdAfx.h"
/******************************************************************************************************************
CParticleSystem Class
*******************************************************************************************************************/
CParticleSystem::CParticleSystem()
{
InitSystem();
}
CParticleSystem::~CParticleSystem()
{
DestroySystem();
}
VOID CParticleSystem::InitSystem()
{
m_wNum = 0;
m_pxParticle = NULL;
m_fDeltaTime = 0.02f;
m_fAirFiction = -0.05f;
m_vecBounding[0] = D3DVECTOR(0, 0, 0);
m_vecBounding[1] = D3DVECTOR(0, 0, 0);
m_vecEnvironment = D3DVECTOR(0, 300, 0);
D3DVECTOR vNorm(0, 0, -1);
m_avShape[0] = D3DVERTEX(D3DVECTOR(-0.5f,-0.5f, 0.0f ), vNorm, 0.0f, 1.0f);
m_avShape[1] = D3DVERTEX(D3DVECTOR( 0.5f,-0.5f, 0.0f ), vNorm, 0.0f, 0.0f);
m_avShape[2] = D3DVERTEX(D3DVECTOR(-0.5f, 0.5f, 0.0f ), vNorm, 1.0f, 1.0f);
m_avShape[3] = D3DVERTEX(D3DVECTOR( 0.5f, 0.5f, 0.0f ), vNorm, 1.0f, 0.0f);
}
VOID CParticleSystem::SetupSystem(WORD wCnt)
{
InitSystem();
m_wNum = wCnt;
m_pxParticle = new CParticle[m_wNum];
for ( INT nCnt = 0; nCnt < m_wNum; nCnt++ )
{
m_pxParticle[nCnt].Init();
}
}
VOID CParticleSystem::DestroySystem()
{
SAFE_DELETE(m_pxParticle);
InitSystem();
}
VOID CParticleSystem::UpdateAirFiction(WORD wNum)
{
if ( !m_pxParticle[wNum].m_bIsDead )
{
m_pxParticle[wNum].m_vecLocalForce.x = -m_pxParticle[wNum].m_vecVel.x * m_fAirFiction;
m_pxParticle[wNum].m_vecLocalForce.y = -m_pxParticle[wNum].m_vecVel.y * m_fAirFiction;
m_pxParticle[wNum].m_vecLocalForce.z = m_pxParticle[wNum].m_vecVel.z * m_fAirFiction;
}
}
VOID CParticleSystem::UpdateMove(WORD wNum)
{
if ( !m_pxParticle[wNum].m_bIsDead )
{
m_pxParticle[wNum].m_vecAccel.x += (m_vecEnvironment.x + m_pxParticle[wNum].m_vecLocalForce.x) / m_pxParticle[wNum].m_fMass;
m_pxParticle[wNum].m_vecAccel.y += (m_vecEnvironment.y + m_pxParticle[wNum].m_vecLocalForce.y) / m_pxParticle[wNum].m_fMass;
m_pxParticle[wNum].m_vecAccel.z += (m_vecEnvironment.z + m_pxParticle[wNum].m_vecLocalForce.z) / m_pxParticle[wNum].m_fMass;
m_pxParticle[wNum].m_vecVel.x += m_pxParticle[wNum].m_vecAccel.x * m_fDeltaTime;//*0.01f;
m_pxParticle[wNum].m_vecVel.y += m_pxParticle[wNum].m_vecAccel.y * m_fDeltaTime;//*0.01f;
m_pxParticle[wNum].m_vecVel.z += m_pxParticle[wNum].m_vecAccel.z * m_fDeltaTime;//*0.01f;
m_pxParticle[wNum].m_vecOldPos = m_pxParticle[wNum].m_vecPos;
m_pxParticle[wNum].m_vecPos.x += m_pxParticle[wNum].m_vecVel.x * m_fDeltaTime;//*0.01f;
m_pxParticle[wNum].m_vecPos.y += m_pxParticle[wNum].m_vecVel.y * m_fDeltaTime;//*0.01f;
m_pxParticle[wNum].m_vecPos.z += m_pxParticle[wNum].m_vecVel.z * m_fDeltaTime;//*0.01f;
}
}
VOID CParticleSystem::UpdateCrash(WORD wNum)
{
if ( !m_pxParticle[wNum].m_bIsDead )
{
if ( m_pxParticle[wNum].m_vecPos.x <= m_vecBounding[0].x || m_pxParticle[wNum].m_vecPos.x >= m_vecBounding[1].x )
{
m_pxParticle[wNum].m_vecVel.x = -m_pxParticle[wNum].m_vecVel.x * 0.7f;
}
if ( m_pxParticle[wNum].m_vecPos.y <= m_vecBounding[0].y || m_pxParticle[wNum].m_vecPos.y >= m_vecBounding[1].y )
{
FLOAT fOldX = m_pxParticle[wNum].m_vecPos.x - m_pxParticle[wNum].m_vecVel.x * m_pxParticle[wNum].m_wDelay;
FLOAT fOldY = m_pxParticle[wNum].m_vecPos.y - m_pxParticle[wNum].m_vecVel.y * m_pxParticle[wNum].m_wDelay;
FLOAT fBefore = m_pxParticle[wNum].m_wDelay * (m_vecBounding[1].y - fOldY)/(m_pxParticle[wNum].m_vecPos.y - fOldY); // 面倒傈.
FLOAT fAfter = m_pxParticle[wNum].m_wDelay * (m_pxParticle[wNum].m_vecPos.y - m_vecBounding[1].y)/(m_pxParticle[wNum].m_vecPos.y - fOldY); // 面倒饶.
m_pxParticle[wNum].m_vecPos.x = fOldX + m_pxParticle[wNum].m_vecVel.x * fBefore;
m_pxParticle[wNum].m_vecPos.y = fOldY + m_pxParticle[wNum].m_vecVel.y * fBefore;
m_pxParticle[wNum].m_vecVel.y = -m_pxParticle[wNum].m_vecVel.y * 0.6f;
m_pxParticle[wNum].m_vecPos.x += m_pxParticle[wNum].m_vecVel.x * fAfter;
m_pxParticle[wNum].m_vecPos.y += m_pxParticle[wNum].m_vecVel.y * fAfter;
}
if ( m_pxParticle[wNum].m_vecPos.z <= m_vecBounding[0].z || m_pxParticle[wNum].m_vecPos.z >= m_vecBounding[1].y )
{
m_pxParticle[wNum].m_vecVel.z = -m_pxParticle[wNum].m_vecVel.z * 0.6f;
}
}
}
/******************************************************************************************************************
CSnow Class
*******************************************************************************************************************/
CSnow::CSnow()
{
InitSystem();
}
CSnow::~CSnow()
{
DestroySystem();
}
VOID CSnow::LoadTextr()
{
CHAR* szFileList[] =
{
"Snow0.bmp",
/* "0000.bmp",
"0001.bmp",
"0002.bmp",
"0003.bmp",
*/
/* "shine0.bmp",
"shine1.bmp",
"shine2.bmp",
"shine3.bmp",
"shine4.bmp",
"shine5.bmp",
"shine6.bmp",
"shine7.bmp",
"shine8.bmp",
"shine9.bmp",
*/ };
for ( INT nCnt = 0; nCnt < _MAX_SNOWFRAME; nCnt++ )
{
strcpy(m_szSnowFile[nCnt], szFileList[nCnt]);
D3DTextr_CreateTextureFromFile(m_szSnowFile[nCnt]);
D3DTextr_Restore(m_szSnowFile[nCnt], g_xMainWnd.Get3DDevice());
}
}
VOID CSnow::InitSystem()
{
CParticleSystem::InitSystem();
m_fWidth = m_fGround = 0.0f;
ZeroMemory(m_szSnowFile, _MAX_SNOWFRAME*MAX_PATH);
}
VOID CSnow::DestroySystem()
{
CParticleSystem::DestroySystem();
for ( INT nCnt = 0; nCnt < _MAX_SNOWFRAME; nCnt++ )
{
D3DTextr_Invalidate(m_szSnowFile[nCnt]);
D3DTextr_DestroyTexture(m_szSnowFile[nCnt]);
}
InitSystem();
}
VOID CSnow::SetupSystem(WORD wCnt, FLOAT fWidth, FLOAT fGround)
{
InitSystem();
CParticleSystem::SetupSystem(wCnt);
m_fWidth = fWidth;
m_fGround = fGround;
LoadTextr();
SetEnvFactor(-0.05f, D3DVECTOR(10, 100, 0));
}
VOID CSnow::UpdateSystem(INT nLoopTime, D3DVECTOR vecGenPos)
{
INT nGenCnt = 0;
INT nSpeedRate = (nLoopTime / 17);
if ( nSpeedRate < 1 )
nSpeedRate = 1;
m_fDeltaTime = 0.02f*nSpeedRate;
for ( INT nCnt = 0; nCnt < m_wNum; nCnt++ )
{
m_pxParticle[nCnt].m_wCurrLife += nLoopTime;
if ( m_pxParticle[nCnt].m_wCurrLife > m_pxParticle[nCnt].m_wLife || m_pxParticle[nCnt].m_vecPos.y >= m_fGround )
{
if( (m_pxParticle[nCnt].m_wCurrLife-m_pxParticle[nCnt].m_wLife) > 255 )
{
m_pxParticle[nCnt].m_bIsDead = TRUE;
}
else
{
BYTE bRate;
bRate = 255 - (m_pxParticle[nCnt].m_wCurrLife-m_pxParticle[nCnt].m_wLife);
m_pxParticle[nCnt].m_bOpa = bRate;
if ( bRate < m_pxParticle[nCnt].m_bRed ) m_pxParticle[nCnt].m_bRed = bRate;
if ( bRate < m_pxParticle[nCnt].m_bGreen ) m_pxParticle[nCnt].m_bGreen = bRate;
if ( bRate < m_pxParticle[nCnt].m_bBlue ) m_pxParticle[nCnt].m_bBlue = bRate;
continue;
}
}
if ( m_pxParticle[nCnt].m_bIsDead && nGenCnt < 20 )
{
SetParticleDefault(nCnt);
nGenCnt++;
}
else
{
UpdateAirFiction(nCnt);
UpdateMove(nCnt);
m_pxParticle[nCnt].m_wCurrDelay += nLoopTime;
if ( m_pxParticle[nCnt].m_wCurrDelay > m_pxParticle[nCnt].m_wDelay )
{
m_pxParticle[nCnt].m_wCurrDelay = 0;
m_pxParticle[nCnt].m_wCurrFrame++;
// FLOAT fRand = _RAND_FLOAT;
// SetEnvFactor(fRand, D3DVECTOR(-fRand, fRand*100, 0));
if ( m_pxParticle[nCnt].m_wCurrFrame >= _MAX_SNOWFRAME )
{
m_pxParticle[nCnt].m_wCurrFrame = 0;
}
}
}
}
}
HRESULT CSnow::RenderSystem(LPDIRECT3DDEVICE7 lpDevice)
{
if ( lpDevice )
{
if( SUCCEEDED(lpDevice->BeginScene()) )
{
D3DMATRIX matWorldOriginal;
D3DMATRIX matTrans;
D3DMATRIX matScale;
D3DMATRIX matWorld;
D3DVECTOR vTrans;
D3DMATERIAL7 mtrl;
lpDevice->GetTransform(D3DTRANSFORMSTATE_WORLD, &matWorldOriginal);
for ( INT nCnt = 0; nCnt < m_wNum; nCnt++ )
{
if ( !m_pxParticle[nCnt].m_bIsDead )
{
D3DUtil_InitMaterial(mtrl,
(FLOAT)m_pxParticle[nCnt].m_bRed/255.0f,
(FLOAT)m_pxParticle[nCnt].m_bGreen/255.0f,
(FLOAT)m_pxParticle[nCnt].m_bBlue/255.0f);
mtrl.diffuse.a = 0.0f;
// mtrl.diffuse.a = m_pxParticle[nCnt].m_bOpa/255.0f;
lpDevice->SetMaterial(&mtrl);
// SetBlendRenderState(lpDevice, _BLEND_NORMAL, mtrl);
lpDevice->SetRenderState( D3DRENDERSTATE_ALPHABLENDENABLE, TRUE );
lpDevice->SetRenderState(D3DRENDERSTATE_COLORKEYENABLE, TRUE);
lpDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
lpDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
lpDevice->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE);
lpDevice->SetRenderState(D3DRENDERSTATE_SRCBLEND, D3DBLEND_ONE);
lpDevice->SetRenderState(D3DRENDERSTATE_DESTBLEND, D3DBLEND_INVSRCALPHA);
vTrans.x = (FLOAT) m_pxParticle[nCnt].m_vecPos.x-400;
vTrans.y = (FLOAT)-m_pxParticle[nCnt].m_vecPos.y+300;
vTrans.z = (FLOAT) m_pxParticle[nCnt].m_vecPos.z;
D3DUtil_SetScaleMatrix(matScale, m_pxParticle[nCnt].m_fSize, m_pxParticle[nCnt].m_fSize, m_pxParticle[nCnt].m_fSize);
D3DUtil_SetTranslateMatrix(matTrans, vTrans);
D3DMath_MatrixMultiply(matWorld, matScale, matTrans);
lpDevice->SetTransform(D3DTRANSFORMSTATE_WORLD, &matWorld);
lpDevice->SetTexture(0, D3DTextr_GetSurface(m_szSnowFile[m_pxParticle[nCnt].m_wCurrFrame]));
lpDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, D3DFVF_VERTEX, m_avShape, 4, NULL);
lpDevice->SetTransform(D3DTRANSFORMSTATE_WORLD, &matWorldOriginal);
}
}
// ResetBlendenderState(lpDevice);
lpDevice->SetRenderState(D3DRENDERSTATE_ALPHABLENDENABLE, FALSE);
lpDevice->SetRenderState(D3DRENDERSTATE_COLORKEYENABLE, FALSE);
lpDevice->SetRenderState(D3DRENDERSTATE_SRCBLEND , D3DBLEND_ONE);
lpDevice->SetRenderState(D3DRENDERSTATE_DESTBLEND, D3DBLEND_ZERO);
lpDevice->SetTransform(D3DTRANSFORMSTATE_WORLD, &matWorldOriginal);
lpDevice->EndScene();
return S_OK;
}
}
return E_FAIL;
}
VOID CSnow::SetParticleDefault(WORD wNum, D3DVECTOR vecGenPos)
{
m_pxParticle[wNum].m_vecPos = D3DVECTOR((FLOAT)GetRandomNum(0, m_fWidth)/*(-400, 1200)*/, (FLOAT)GetRandomNum(-300, 0), 0.0f);
m_pxParticle[wNum].m_vecVel = D3DVECTOR((FLOAT)GetRandomNum(-30, 30), (FLOAT)GetRandomNum(70, 100), 0.0f);
m_pxParticle[wNum].m_vecAccel = D3DVECTOR(0.0f, 0.0f, 0.0f);
m_pxParticle[wNum].m_vecOldPos = D3DVECTOR(0.0f, 0.0f, 0.0f);
m_pxParticle[wNum].m_vecLocalForce = D3DVECTOR(0.0f, 0.0f, 0.0f);
m_pxParticle[wNum].m_wLife = (FLOAT)GetRandomNum(2500, 7000);
m_pxParticle[wNum].m_fMass = 1000 + _RAND_FLOAT;
m_pxParticle[wNum].m_fSize = (FLOAT)GetRandomNum(2, 6) + _RAND_FLOAT;
// m_pxParticle[wNum].m_wLife = (FLOAT)GetRandomNum((BYTE)m_pxParticle[wNum].m_fSize*2000, 6000);
m_pxParticle[wNum].m_bIsDead = FALSE;
m_pxParticle[wNum].m_bRed = m_pxParticle[wNum].m_bGreen = m_pxParticle[wNum].m_bBlue = (FLOAT)GetRandomNum(/*(BYTE)(m_pxParticle[wNum].m_fSize)*30+20*/150, 200);
m_pxParticle[wNum].m_bBlue += 50;
// m_pxParticle[wNum].m_bRed = (FLOAT)GetRandomNum(0, 255);
// m_pxParticle[wNum].m_bGreen = (FLOAT)GetRandomNum(0, 255);
// m_pxParticle[wNum].m_bBlue = (FLOAT)GetRandomNum(0, 255);
m_pxParticle[wNum].m_wDelay = 300;//(FLOAT)GetRandomNum(50, 150);
m_pxParticle[wNum].m_wCurrLife = 0;
m_pxParticle[wNum].m_wCurrDelay = 0;
m_pxParticle[wNum].m_wCurrFrame = 0;
m_pxParticle[wNum].m_bOpa = 255;
}
/******************************************************************************************************************
CRain Class
*******************************************************************************************************************/
CRain::CRain()
{
InitSystem();
}
CRain::~CRain()
{
DestroySystem();
}
VOID CRain::LoadTextr()
{
CHAR* szFileList1[] =
{
// "Rain0.bmp",
"Snow0.bmp",
};
CHAR* szFileList2[] =
{
"RainDrop0.bmp",
"RainDrop1.bmp",
"RainDrop2.bmp",
"RainDrop3.bmp",
"RainDrop4.bmp",
};
for ( INT nCnt = 0; nCnt < _MAX_RAINFRAME; nCnt++ )
{
strcpy(m_pszRainFile[nCnt], szFileList1[nCnt]);
D3DTextr_CreateTextureFromFile(m_pszRainFile[nCnt]);
D3DTextr_Restore(m_pszRainFile[nCnt], g_xMainWnd.Get3DDevice());
}
for ( nCnt = 0; nCnt < _MAX_RAINDROPFRAME; nCnt++ )
{
strcpy(m_pszRainDropFile[nCnt], szFileList2[nCnt]);
D3DTextr_CreateTextureFromFile(m_pszRainDropFile[nCnt]);
D3DTextr_Restore(m_pszRainDropFile[nCnt], g_xMainWnd.Get3DDevice());
}
}
VOID CRain::InitSystem()
{
CParticleSystem::InitSystem();
m_fWidth = m_fGround = 0.0f;
m_bRainIntensity = 0;
m_bGenCnt = 10;
ZeroMemory(m_pszRainFile, _MAX_RAINFRAME*MAX_PATH);
ZeroMemory(m_pszRainDropFile, _MAX_RAINDROPFRAME*MAX_PATH);
}
VOID CRain::DestroySystem()
{
CParticleSystem::DestroySystem();
for ( INT nCnt = 0; nCnt < _MAX_RAINFRAME; nCnt++ )
{
D3DTextr_Invalidate(m_pszRainFile[nCnt]);
D3DTextr_DestroyTexture(m_pszRainFile[nCnt]);
}
for ( nCnt = 0; nCnt < _MAX_RAINDROPFRAME; nCnt++ )
{
D3DTextr_Invalidate(m_pszRainDropFile[nCnt]);
D3DTextr_DestroyTexture(m_pszRainDropFile[nCnt]);
}
InitSystem();
}
VOID CRain::SetupSystem(WORD wCnt, FLOAT fWidth, FLOAT fGround)
{
InitSystem();
CParticleSystem::SetupSystem(wCnt);
m_fWidth = fWidth;
m_fGround = fGround;
LoadTextr();
SetEnvFactor(-0.05f, D3DVECTOR(10, 100, 0));
}
VOID CRain::UpdateSystem(INT nLoopTime, D3DVECTOR vecGenPos)
{
INT nGenCnt = 0;
INT nSpeedRate = (nLoopTime / 17);
if ( nSpeedRate < 1 )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -