📄 particle.cpp
字号:
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) > /*_MAX_RAINDROPFRAME*50*/250 )
{
m_pxParticle[nCnt].m_bIsDead = TRUE;
}
else
{
BYTE bRate;
bRate = /*50*_MAX_RAINDROPFRAME*/250 - (m_pxParticle[nCnt].m_wCurrLife-m_pxParticle[nCnt].m_wLife) / 4;
m_pxParticle[nCnt].m_bOpa = bRate;
m_pxParticle[nCnt].m_wDelay = 50;
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;
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_RAINDROPFRAME )
{
m_pxParticle[nCnt].m_wCurrFrame = 0;
}
}
continue;
}
}
if ( m_pxParticle[nCnt].m_bIsDead && nGenCnt < m_bGenCnt )
{
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++;
if ( m_pxParticle[nCnt].m_wCurrFrame >= _MAX_RAINFRAME )
{
m_pxParticle[nCnt].m_wCurrFrame = 0;
}
}
}
}
}
HRESULT CRain::RenderSystem(LPDIRECT3DDEVICE7 lpDevice)
{
if ( lpDevice )
{
if( SUCCEEDED(lpDevice->BeginScene()) )
{
D3DMATRIX matWorldOriginal;
D3DMATRIX matTrans;
D3DMATRIX matScale;
D3DMATRIX matRot;
D3DMATRIX matWorld;
D3DMATRIX matTmpWorld;
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_LIGHTINV, 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, 1.5f, m_pxParticle[nCnt].m_fSize, 1.0f);
D3DUtil_SetRotateZMatrix(matRot, g_PI/2 - atan((m_pxParticle[nCnt].m_vecPos.y - m_pxParticle[nCnt].m_vecOldPos.y)/(m_pxParticle[nCnt].m_vecPos.x - m_pxParticle[nCnt].m_vecOldPos.x)));
D3DUtil_SetTranslateMatrix(matTrans, vTrans);
D3DMath_MatrixMultiply(matTmpWorld, matRot, matTrans);
D3DMath_MatrixMultiply(matWorld, matScale, matTmpWorld);
lpDevice->SetTransform(D3DTRANSFORMSTATE_WORLD, &matWorld);
if( (m_pxParticle[nCnt].m_wCurrLife-m_pxParticle[nCnt].m_wLife) > 0 && (m_pxParticle[nCnt].m_wCurrLife-m_pxParticle[nCnt].m_wLife) < 510 )
{
D3DUtil_SetScaleMatrix(matScale, 64.0f, 64.0f, 1.0f);
// D3DUtil_SetRotateZMatrix(matRot, (FLOAT)GetRandomNum(0, 2) + _RAND_FLOAT);
D3DUtil_SetTranslateMatrix(matTrans, vTrans);
D3DMath_MatrixMultiply(matTmpWorld, matRot, matTrans);
D3DMath_MatrixMultiply(matWorld, matScale, matTmpWorld);
lpDevice->SetTransform(D3DTRANSFORMSTATE_WORLD, &matWorld);
lpDevice->SetTexture(0, D3DTextr_GetSurface(m_pszRainDropFile[m_pxParticle[nCnt].m_wCurrFrame]));
}
else
{
lpDevice->SetTexture(0, D3DTextr_GetSurface(m_pszRainFile[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 CRain::SetParticleDefault(WORD wNum, D3DVECTOR vecGenPos)
{
// m_bRainIntensity ---> 厚狼 碍档啊 缴秦龙荐废 gencnt, mass, size, delay, velocity殿俊 康氢阑 固模促.
ZeroMemory(&m_pxParticle[wNum], sizeof(CParticle));
m_pxParticle[wNum].m_vecPos = D3DVECTOR((FLOAT)GetRandomNum(-100, m_fWidth+100)/*(-400, 1200)*/, (FLOAT)GetRandomNum(-500, 0), 0.0f);
m_pxParticle[wNum].m_vecVel = D3DVECTOR((FLOAT)/*GetRandomNum(0, 10)*/0, 500/*(FLOAT)GetRandomNum(10, 30)*/, 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(800, 1400);
m_pxParticle[wNum].m_fMass = 100.0f;
m_pxParticle[wNum].m_fSize = (FLOAT)GetRandomNum(3, 30) + _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*/120, 180);
m_pxParticle[wNum].m_bBlue = 125;
// 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 = (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;
}
/******************************************************************************************************************
CFly Class
*******************************************************************************************************************/
CFly::CFly()
{
InitSystem();
}
CFly::~CFly()
{
DestroySystem();
}
VOID CFly::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_FLYFRAME; nCnt++ )
{
strcpy(m_pszFlyFile[nCnt], szFileList[nCnt]);
D3DTextr_CreateTextureFromFile(m_pszFlyFile[nCnt]);
D3DTextr_Restore(m_pszFlyFile[nCnt], g_xMainWnd.Get3DDevice());
}
}
VOID CFly::InitSystem()
{
CParticleSystem::InitSystem();
m_bGenCnt = 3;
ZeroMemory(m_pszFlyFile, _MAX_FLYFRAME*MAX_PATH);
}
VOID CFly::DestroySystem()
{
CParticleSystem::DestroySystem();
for ( INT nCnt = 0; nCnt < _MAX_FLYFRAME; nCnt++ )
{
D3DTextr_Invalidate(m_pszFlyFile[nCnt]);
D3DTextr_DestroyTexture(m_pszFlyFile[nCnt]);
}
InitSystem();
}
VOID CFly::SetupSystem(WORD wCnt)
{
InitSystem();
CParticleSystem::SetupSystem(wCnt);
LoadTextr();
SetEnvFactor(-0.05f, D3DVECTOR(100, 1000, 0));
}
VOID CFly::UpdateSystem(INT nLoopTime, D3DVECTOR vecGenPos)
{
BYTE bRate;
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_bIsDead = TRUE;
}
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++;
m_pxParticle[nCnt].m_fSize += 0.5f;
if ( m_pxParticle[nCnt].m_wCurrFrame >= _MAX_FLYFRAME )
{
m_pxParticle[nCnt].m_wCurrFrame = 0;
}
}
/* bRate = 255 - 255*(FLOAT)((FLOAT)m_pxParticle[nCnt].m_wCurrLife/(FLOAT)m_pxParticle[nCnt].m_wLife);
m_pxParticle[nCnt].m_bRed = m_pxParticle[nCnt].m_bGreen = m_pxParticle[nCnt].m_bBlue = bRate;
*/ 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);
}
if ( m_pxParticle[nCnt].m_bIsDead )
{
if ( nGenCnt < m_bGenCnt )
{
SetParticleDefault(nCnt, vecGenPos);
nGenCnt++;
}
}
}
}
HRESULT CFly::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, 1);
D3DUtil_SetTranslateMatrix(matTrans, vTrans);
D3DMath_MatrixMultiply(matWorld, matScale, matTrans);
lpDevice->SetTransform(D3DTRANSFORMSTATE_WORLD, &matWorld);
lpDevice->SetTexture(0, D3DTextr_GetSurface(m_pszFlyFile[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 CFly::SetParticleDefault(WORD wNum, D3DVECTOR vecGenPos)
{
// m_bRainIntensity ---> 厚狼 碍档啊 缴秦龙荐废 gencnt, mass, size, delay, velocity殿俊 康氢阑 固模促.
ZeroMemory(&m_pxParticle[wNum], sizeof(CParticle));
m_pxParticle[wNum].m_vecPos = vecGenPos;
m_pxParticle[wNum].m_vecVel = D3DVECTOR((FLOAT)GetRandomNum(-30, 30), (FLOAT)GetRandomNum(-20, 40), 0.0f);
m_pxParticle[wNum].m_wLife = (FLOAT)GetRandomNum(500, 1500);
m_pxParticle[wNum].m_fMass = 1000.0f;
m_pxParticle[wNum].m_fSize = (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 = 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_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;
}
/******************************************************************************************************************
CBoom Class
*******************************************************************************************************************/
CBoom::CBoom()
{
InitSystem();
}
CBoom::~CBoom()
{
DestroySystem();
}
VOID CBoom::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_BOOMFRAME; nCnt++ )
{
strcpy(m_pszBoomFile[nCnt], szFileList[nCnt]);
D3DTextr_CreateTextureFromFile(m_pszBoomFile[nCnt]);
D3DTextr_Restore(m_pszBoomFile[nCnt], g_xMainWnd.Get3DDevice());
}
}
VOID CBoom::InitSystem()
{
CParticleSystem::InitSystem();
m_shPartNum = 0;
ZeroMemory(m_pszBoomFile, _MAX_BOOMFRAME*MAX_PATH);
}
VOID CBoom::DestroySystem()
{
CParticleSystem::DestroySystem();
for ( INT nCnt = 0; nCnt < _MAX_BOOMFRAME; nCnt++ )
{
D3DTextr_Invalidate(m_pszBoomFile[nCnt]);
D3DTextr_DestroyTexture(m_pszBoomFile[nCnt]);
}
InitSystem();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -