📄 particle.cpp
字号:
VOID CBoom::SetupSystem(WORD wCnt)
{
InitSystem();
CParticleSystem::SetupSystem(wCnt);
LoadTextr();
SetEnvFactor(-0.05f, D3DVECTOR(0, 200, 0));
}
VOID CBoom::UpdateSystem(INT nLoopTime, D3DVECTOR vecGenPos)
{
INT nSpeedRate = (nLoopTime / 17);
INT nPartCnt = 0;
if ( nSpeedRate < 1 )
nSpeedRate = 1;
m_fDeltaTime = 0.02f*nSpeedRate;
for ( INT nCnt = 0; nCnt < m_wNum; nCnt++ )
{
if ( !m_pxParticle[nCnt].m_bIsDead )
{
m_pxParticle[nCnt].m_wCurrLife += nLoopTime;
if ( m_pxParticle[nCnt].m_wCurrLife > m_pxParticle[nCnt].m_wLife )
{
m_pxParticle[nCnt].Init();
m_shPartNum--;
nPartCnt--;
}
else
{
m_pxParticle[nCnt].m_wCurrDelay += nLoopTime;
m_pxParticle[nCnt].m_fMass += 3.0f;
if ( m_pxParticle[nCnt].m_fSize < 0 )
m_pxParticle[nCnt].m_fSize = 0;
if ( m_pxParticle[nCnt].m_wCurrDelay > m_pxParticle[nCnt].m_wDelay )
{
m_pxParticle[nCnt].m_wCurrDelay = 0;
m_pxParticle[nCnt].m_wCurrFrame++;
if ( m_pxParticle[nCnt].m_wCurrFrame >= _MAX_BOOMFRAME )
{
m_pxParticle[nCnt].m_wCurrFrame = 0;
}
}
m_pxParticle[nCnt].m_fSize = m_pxParticle[nCnt].m_fOriSize - m_pxParticle[nCnt].m_fOriSize*(FLOAT)((FLOAT)m_pxParticle[nCnt].m_wCurrLife/(FLOAT)m_pxParticle[nCnt].m_wLife);
UpdateAirFiction(nCnt);
UpdateMove(nCnt);
}
nPartCnt++;
if ( nPartCnt >= m_shPartNum )
return;
}
}
}
HRESULT CBoom::RenderSystem(LPDIRECT3DDEVICE7 lpDevice)
{
INT nPartCnt = 0;
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;
lpDevice->SetMaterial(&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, 1);
D3DUtil_SetTranslateMatrix(matTrans, vTrans);
D3DMath_MatrixMultiply(matWorld, matScale, matTrans);
lpDevice->SetTransform(D3DTRANSFORMSTATE_WORLD, &matWorld);
lpDevice->SetTexture(0, D3DTextr_GetSurface(m_pszBoomFile[m_pxParticle[nCnt].m_wCurrFrame]));
lpDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, D3DFVF_VERTEX, m_avShape, 4, NULL);
lpDevice->SetTransform(D3DTRANSFORMSTATE_WORLD, &matWorldOriginal);
nPartCnt++;
if ( nPartCnt >= m_shPartNum )
break;
}
}
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 CBoom::SetBoomParticle(D3DVECTOR vecGenPos)
{
INT nGenCnt = 0;
for ( INT nCnt = 0; nCnt < m_wNum; nCnt++ )
{
if ( m_pxParticle[nCnt].m_bIsDead )
{
SetParticleDefault(nCnt, vecGenPos);
m_shPartNum++;
nGenCnt++;
if ( nGenCnt > 10 )
return;
}
}
/* for ( INT nCnt = 0; nCnt < m_wNum; nCnt++ )
{
if ( m_pxParticle[nCnt].m_bIsDead )
{
// vecGenPos.x += GetRandomNum(-2, 2);
// vecGenPos.y += GetRandomNum(-2, 2);
// vecGenPos.z += GetRandomNum(-10, 10);
SetParticleDefault(nCnt, vecGenPos);
}
}
*/
}
VOID CBoom::SetParticleDefault(WORD wNum, D3DVECTOR vecGenPos)
{
ZeroMemory(&m_pxParticle[wNum], sizeof(CParticle));
m_pxParticle[wNum].m_vecPos = vecGenPos;
// m_pxParticle[wNum].m_vecVel = D3DVECTOR((FLOAT)GetRandomNum(-40, 40), (FLOAT)GetRandomNum(-100, -20), 0.0f);
// m_pxParticle[wNum].m_vecVel = D3DVECTOR((FLOAT)GetRandomNum(-60, 60), (FLOAT)GetRandomNum(-80, 0), 0.0f);
// m_pxParticle[wNum].m_vecVel = D3DVECTOR((FLOAT)GetRandomNum(-50, 50), (FLOAT)GetRandomNum(-100, -20), 0.0f);
// m_pxParticle[wNum].m_vecVel = D3DVECTOR((FLOAT)GetRandomNum(-60, 60), (FLOAT)GetRandomNum(-150, -50), 0.0f);
m_pxParticle[wNum].m_vecVel = D3DVECTOR((FLOAT)GetRandomNum(-75, 75), (FLOAT)GetRandomNum(-180, -50), 0.0f);
m_pxParticle[wNum].m_wLife = (FLOAT)GetRandomNum(800, 1200);
m_pxParticle[wNum].m_fMass = 1.0f;
m_pxParticle[wNum].m_fSize = m_pxParticle[wNum].m_fOriSize = (FLOAT)GetRandomNum(5, 40) + _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_bFstRed = (FLOAT)GetRandomNum(200, 255);
m_pxParticle[wNum].m_bGreen = m_pxParticle[wNum].m_bFstGreen = (FLOAT)GetRandomNum(0, 150);
m_pxParticle[wNum].m_bBlue = m_pxParticle[wNum].m_bFstBlue = (FLOAT)GetRandomNum(0, 150);
*/
/* m_pxParticle[wNum].m_bRed = m_pxParticle[wNum].m_bFstRed = (FLOAT)GetRandomNum(150, 200);
m_pxParticle[wNum].m_bGreen = m_pxParticle[wNum].m_bFstGreen = (FLOAT)GetRandomNum(150, 200);
m_pxParticle[wNum].m_bBlue = m_pxParticle[wNum].m_bFstBlue = (FLOAT)GetRandomNum(200, 255);
*/
m_pxParticle[wNum].m_bRed = m_pxParticle[wNum].m_bFstRed = (FLOAT)GetRandomNum(0, 255);
m_pxParticle[wNum].m_bGreen = m_pxParticle[wNum].m_bFstGreen = m_pxParticle[wNum].m_bFstRed/2;
m_pxParticle[wNum].m_bBlue = m_pxParticle[wNum].m_bFstBlue = 0;
m_pxParticle[wNum].m_wDelay = (FLOAT)GetRandomNum(200, 300);
// m_pxParticle[wNum].m_wCurrLife = 0;
// m_pxParticle[wNum].m_wCurrDelay = 0;
// m_pxParticle[wNum].m_wCurrFrame = 0;
// m_pxParticle[wNum].m_bOpa = 255;
}
/******************************************************************************************************************
CFlyingTail Class
*******************************************************************************************************************/
CFlyingTail::CFlyingTail()
{
InitSystem();
}
CFlyingTail::~CFlyingTail()
{
DestroySystem();
}
VOID CFlyingTail::LoadTextr()
{
CHAR* szFileList[] =
{
"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_FLYTAILFRAME; nCnt++ )
{
strcpy(m_pszFlyingTailFile[nCnt], szFileList[nCnt]);
D3DTextr_CreateTextureFromFile(m_pszFlyingTailFile[nCnt]);
D3DTextr_Restore(m_pszFlyingTailFile[nCnt], g_xMainWnd.Get3DDevice());
}
}
VOID CFlyingTail::InitSystem()
{
CParticleSystem::InitSystem();
m_shPartNum = 0;
ZeroMemory(m_pszFlyingTailFile, _MAX_FLYTAILFRAME*MAX_PATH);
}
VOID CFlyingTail::DestroySystem()
{
CParticleSystem::DestroySystem();
for ( INT nCnt = 0; nCnt < _MAX_FLYTAILFRAME; nCnt++ )
{
D3DTextr_Invalidate(m_pszFlyingTailFile[nCnt]);
D3DTextr_DestroyTexture(m_pszFlyingTailFile[nCnt]);
}
InitSystem();
}
VOID CFlyingTail::SetupSystem(WORD wCnt)
{
InitSystem();
CParticleSystem::SetupSystem(wCnt);
LoadTextr();
SetEnvFactor(-0.05f, D3DVECTOR(100, 1000, 0));
}
VOID CFlyingTail::SetFlyTailParticle(D3DVECTOR vecGenPos)
{
INT nGenCnt = 0;
for ( INT nCnt = 0; nCnt < m_wNum; nCnt++ )
{
if ( m_pxParticle[nCnt].m_bIsDead )
{
SetParticleDefault(nCnt, vecGenPos);
m_shPartNum++;
nGenCnt++;
if ( nGenCnt > 2 )
return;
}
}
}
VOID CFlyingTail::UpdateSystem(INT nLoopTime, D3DVECTOR vecGenPos)
{
BYTE bRate;
INT nSpeedRate, nPartCnt;
nPartCnt = 0;
nSpeedRate = (nLoopTime / 17);
if ( nSpeedRate < 1 ) nSpeedRate = 1;
int check = 0;
m_fDeltaTime = 0.02f*nSpeedRate;
for ( INT nCnt = 0; nCnt < m_wNum; nCnt++ )
{
if ( !m_pxParticle[nCnt].m_bIsDead )
{
m_pxParticle[nCnt].m_wCurrLife += nLoopTime;
if ( m_pxParticle[nCnt].m_wCurrLife > m_pxParticle[nCnt].m_wLife )
{
m_pxParticle[nCnt].Init();
m_shPartNum--;
nPartCnt--;
}
else
{
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++;
if ( m_pxParticle[nCnt].m_wCurrFrame >= _MAX_FLYTAILFRAME )
{
m_pxParticle[nCnt].m_wCurrFrame = 0;
}
}
bRate = m_pxParticle[nCnt].m_bFstRed - m_pxParticle[nCnt].m_bFstRed*(FLOAT)((FLOAT)m_pxParticle[nCnt].m_wCurrLife/(FLOAT)m_pxParticle[nCnt].m_wLife);
m_pxParticle[nCnt].m_bRed = bRate;
bRate = m_pxParticle[nCnt].m_bFstGreen - m_pxParticle[nCnt].m_bFstGreen*(FLOAT)((FLOAT)m_pxParticle[nCnt].m_wCurrLife/(FLOAT)m_pxParticle[nCnt].m_wLife);
m_pxParticle[nCnt].m_bGreen = bRate;
bRate = m_pxParticle[nCnt].m_bFstBlue - m_pxParticle[nCnt].m_bFstBlue*(FLOAT)((FLOAT)m_pxParticle[nCnt].m_wCurrLife/(FLOAT)m_pxParticle[nCnt].m_wLife);
m_pxParticle[nCnt].m_bBlue = bRate;
UpdateAirFiction(nCnt);
UpdateMove(nCnt);
}
nPartCnt++;
if ( nPartCnt >= m_shPartNum )
{
return;
}
}
}
}
HRESULT CFlyingTail::RenderSystem(LPDIRECT3DDEVICE7 lpDevice)
{
INT nPartCnt;
nPartCnt = 0;
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;
lpDevice->SetMaterial(&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, 1);
D3DUtil_SetTranslateMatrix(matTrans, vTrans);
D3DMath_MatrixMultiply(matWorld, matScale, matTrans);
lpDevice->SetTransform(D3DTRANSFORMSTATE_WORLD, &matWorld);
lpDevice->SetTexture(0, D3DTextr_GetSurface(m_pszFlyingTailFile[m_pxParticle[nCnt].m_wCurrFrame]));
lpDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, D3DFVF_VERTEX, m_avShape, 4, NULL);
lpDevice->SetTransform(D3DTRANSFORMSTATE_WORLD, &matWorldOriginal);
nPartCnt++;
if ( nPartCnt >= m_shPartNum )
break;
}
}
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 CFlyingTail::SetParticleDefault(WORD wNum, D3DVECTOR vecGenPos)
{
ZeroMemory(&m_pxParticle[wNum], sizeof(CParticle));
m_pxParticle[wNum].m_vecPos = vecGenPos;
m_pxParticle[wNum].m_vecVel = D3DVECTOR((FLOAT)GetRandomNum(-50, 50), (FLOAT)GetRandomNum(-30, 60), 0.0f);
// m_pxParticle[wNum].m_wLife = (FLOAT)GetRandomNum(500, 1000);
m_pxParticle[wNum].m_wLife = (FLOAT)GetRandomNum(150, 400);
m_pxParticle[wNum].m_fMass = 1000.0f;
m_pxParticle[wNum].m_fSize = (FLOAT)GetRandomNum(5, 40) + _RAND_FLOAT;
m_pxParticle[wNum].m_bRed = m_pxParticle[wNum].m_bFstRed = (FLOAT)GetRandomNum(200, 255);
m_pxParticle[wNum].m_bGreen = m_pxParticle[wNum].m_bFstGreen = m_pxParticle[wNum].m_bFstRed/2;//(FLOAT)GetRandomNum(0, 125);
m_pxParticle[wNum].m_bBlue = m_pxParticle[wNum].m_bFstBlue = (FLOAT)GetRandomNum(0, 30);
/*
m_pxParticle[wNum].m_bRed = m_pxParticle[wNum].m_bFstRed = (FLOAT)GetRandomNum(200, 255);
m_pxParticle[wNum].m_bGreen = m_pxParticle[wNum].m_bFstGreen = (FLOAT)GetRandomNum(0, 150);
m_pxParticle[wNum].m_bBlue = m_pxParticle[wNum].m_bFstBlue = (FLOAT)GetRandomNum(0, 150);
*/ m_pxParticle[wNum].m_wDelay = (FLOAT)GetRandomNum(200, 300);
}
/******************************************************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -