📄 particle.cpp
字号:
CSmoke Class
*******************************************************************************************************************/
CSmoke::CSmoke()
{
InitSystem();
}
CSmoke::~CSmoke()
{
DestroySystem();
}
VOID CSmoke::LoadTextr()
{
CHAR* szFileList[] =
{
"Smoke.bmp",
};
for ( INT nCnt = 0; nCnt < _MAX_SMOKEFRAME; nCnt++ )
{
strcpy(m_pszSmokeFile[nCnt], szFileList[nCnt]);
D3DTextr_CreateTextureFromFile(m_pszSmokeFile[nCnt], 0L, D3DTEXTR_TRANSPARENTBLACK);
D3DTextr_Restore(m_pszSmokeFile[nCnt], g_xMainWnd.Get3DDevice());
}
}
VOID CSmoke::InitSystem()
{
CParticleSystem::InitSystem();
m_shPartNum = 0;
ZeroMemory(m_pszSmokeFile, _MAX_SMOKEFRAME*MAX_PATH);
}
VOID CSmoke::DestroySystem()
{
CParticleSystem::DestroySystem();
for ( INT nCnt = 0; nCnt < _MAX_SMOKEFRAME; nCnt++ )
{
D3DTextr_Invalidate(m_pszSmokeFile[nCnt]);
D3DTextr_DestroyTexture(m_pszSmokeFile[nCnt]);
}
InitSystem();
}
VOID CSmoke::SetupSystem(WORD wCnt)
{
InitSystem();
CParticleSystem::SetupSystem(wCnt);
LoadTextr();
SetEnvFactor(-0.05f, D3DVECTOR(0, 1000, 0));
}
VOID CSmoke::UpdateSystem(INT nLoopTime, D3DVECTOR vecGenPos)
{
BYTE bRate;
INT nSpeedRate, nPartCnt;
D3DVECTOR vecAddVel;
nPartCnt = 0;
nSpeedRate = (nLoopTime / 17);
if ( nSpeedRate < 1 ) nSpeedRate = 1;
m_fDeltaTime = 0.02f*nSpeedRate;
// SetSmokeParticle(vecGenPos);
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_SMOKEFRAME )
{
m_pxParticle[nCnt].m_wCurrFrame = 0;
}
}
// m_pxParticle[nCnt].m_fSize = m_pxParticle[nCnt].m_fOriSize + m_pxParticle[nCnt].m_fOriSize*15.0f*(FLOAT)((FLOAT)m_pxParticle[nCnt].m_wCurrLife/(FLOAT)m_pxParticle[nCnt].m_wLife);
// vecAddVel = D3DVECTOR((FLOAT)GetRandomNum(-1, 1), GetRandomNum(-2, 0), 0.0f);
m_pxParticle[nCnt].m_fSize = m_pxParticle[nCnt].m_fOriSize + m_pxParticle[nCnt].m_fOriSize*7.0f*(FLOAT)((FLOAT)m_pxParticle[nCnt].m_wCurrLife/(FLOAT)m_pxParticle[nCnt].m_wLife);
vecAddVel = D3DVECTOR((FLOAT)GetRandomNum(-1, 1), 0.0f, 0.0f);
m_pxParticle[nCnt].m_vecVel += vecAddVel;
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;
}
}
}
VOID CSmoke::SetSmokeParticle(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 > 0 )
return;
}
}
}
HRESULT CSmoke::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_SRCCOLOR);
lpDevice->SetRenderState(D3DRENDERSTATE_DESTBLEND, D3DBLEND_ONE);
*/
SetBlendRenderState(lpDevice, _BLEND_LIGHTINV, mtrl);
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_pszSmokeFile[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;
}
}
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 CSmoke::SetParticleDefault(WORD wNum, D3DVECTOR vecGenPos)
{
ZeroMemory(&m_pxParticle[wNum], sizeof(CParticle));
// vecGenPos.x += (FLOAT)GetRandomNum(-5, 5);
// vecGenPos.y += (FLOAT)GetRandomNum(-8, 2);
m_pxParticle[wNum].m_vecPos = vecGenPos;
m_pxParticle[wNum].m_vecVel = D3DVECTOR((FLOAT)GetRandomNum(-8, 8), /*(FLOAT)GetRandomNum(-15, -10)*/0.0f, 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 = m_pxParticle[wNum].m_fOriSize = (FLOAT)GetRandomNum(5, 10) + _RAND_FLOAT;
m_pxParticle[wNum].m_fSize = m_pxParticle[wNum].m_fOriSize = (FLOAT)GetRandomNum(5, 10) + _RAND_FLOAT;
m_pxParticle[wNum].m_bRed = m_pxParticle[wNum].m_bFstRed = m_pxParticle[wNum].m_bGreen = m_pxParticle[wNum].m_bFstGreen = m_pxParticle[wNum].m_bBlue = m_pxParticle[wNum].m_bFstBlue = (FLOAT)GetRandomNum(100, 150);
m_pxParticle[wNum].m_wDelay = (FLOAT)GetRandomNum(200, 300);
}
/******************************************************************************************************************
CElec Class
*******************************************************************************************************************/
CElec::CElec()
{
InitElec();
}
CElec::~CElec()
{
DestroyElec();
}
VOID CElec::LoadTextr()
{
CHAR* szFileList[] =
{
"Elec.bmp",
};
for ( INT nCnt = 0; nCnt < _MAX_ELECFRAME; nCnt++ )
{
strcpy(m_szElecFile[nCnt], szFileList[nCnt]);
D3DTextr_CreateTextureFromFile(m_szElecFile[nCnt]);
D3DTextr_Restore(m_szElecFile[nCnt], g_xMainWnd.Get3DDevice());
}
}
VOID CElec::SetupElec()
{
D3DVECTOR vNorm(0, 0, -1);
for ( INT nCntY = 0; nCntY < (_MAX_ELEC_NODEY+1); nCntY++ )
{
for ( INT nCntX = 0; nCntX < (_MAX_ELEC_NODEX+1); nCntX++ )
{
FLOAT fXPos = -0.5f+(FLOAT)nCntX/(FLOAT)(_MAX_ELEC_NODEX);
FLOAT fYPos = /*-0.5f+*/(FLOAT)nCntY/(FLOAT)(_MAX_ELEC_NODEY);
FLOAT fu = (FLOAT)nCntX/(FLOAT)(_MAX_ELEC_NODEX);
FLOAT fv = (FLOAT)nCntY/(FLOAT)(_MAX_ELEC_NODEY);
m_avElec[nCntY][nCntX] = D3DVERTEX(D3DVECTOR(fXPos, fYPos, 0), vNorm, fu, fv);
// m_avElec[nCntY][nCntX] = D3DLVERTEX(D3DVECTOR(fXPos, fYPos, 0), RGB(0, 255, 0), RGB(255, 0, 0), fu, fv);
}
}
memcpy(m_avSaveElec, m_avElec, (_MAX_ELEC_NODEY+1)*(_MAX_ELEC_NODEX+1)*sizeof(D3DVERTEX));
// 鸥老弃府帮狼 牢郸胶 积己.
WORD* pwIndex = m_pwElecIndices;
for ( nCntY = 0; nCntY < _MAX_ELEC_NODEY; nCntY++ )
{
for ( INT nCntX = 0; nCntX < _MAX_ELEC_NODEX; nCntX++ )
{
*pwIndex++ = (nCntX+1)+((_MAX_ELEC_NODEX+1)*nCntY);
*pwIndex++ = nCntX+((_MAX_ELEC_NODEX+1)*(nCntY+1));
*pwIndex++ = (nCntX+1)+((_MAX_ELEC_NODEX+1)*(nCntY+1));
*pwIndex++ = nCntX+((_MAX_ELEC_NODEX+1)*(nCntY+1));
*pwIndex++ = (nCntX+1)+((_MAX_ELEC_NODEX+1)*nCntY);
*pwIndex++ = (nCntX)+((_MAX_ELEC_NODEX+1)*nCntY);
}
}
LoadTextr();
}
VOID CElec::InitElec()
{
ZeroMemory(m_szElecFile, _MAX_SNOWFRAME*MAX_PATH);
ZeroMemory(m_pwElecIndices, _ELEC_INDICES*sizeof(WORD));
ZeroMemory(m_avElec, sizeof(D3DVERTEX)*_MAX_ELEC_NODEY+1*_MAX_ELEC_NODEX+1);
ZeroMemory(m_avSaveElec, (_MAX_ELEC_NODEY+1)*(_MAX_ELEC_NODEX+1)*sizeof(D3DVERTEX));
m_fSize = 0;
m_fRadian = 0;
m_shPosX = 0;
m_shPosY = 0;
m_shDstPosX = 0;
m_shDstPosY = 0;
}
VOID CElec::DestroyElec()
{
for ( INT nCnt = 0; nCnt < _MAX_ELECFRAME; nCnt++ )
{
D3DTextr_Invalidate(m_szElecFile[nCnt]);
D3DTextr_DestroyTexture(m_szElecFile[nCnt]);
}
InitElec();
}
VOID CElec::UpdateElec(SHORT shPosX, SHORT shPosY, SHORT shDstPosX, SHORT shDstPosY)
{
DOUBLE dTheta = 0.0f;
FLOAT fDiv = 0.0f;
m_shPosX = shPosX;
m_shPosY = shPosY;
m_shDstPosX = shDstPosX;
m_shDstPosY = shDstPosY;
INT nAbsX = abs(m_shDstPosX - m_shPosX);
INT nAbsY = abs(m_shDstPosY - m_shPosY);
m_fSize = (FLOAT)sqrt((double)(nAbsX*nAbsX + nAbsY*nAbsY));
// fDiv = (FLOAT)(nAbsY)/(FLOAT)(nAbsX);
fDiv = (FLOAT)-(m_shDstPosX - m_shPosX)/m_fSize;
m_fRadian = (FLOAT)asin(fDiv);
if ( m_shDstPosY - m_shPosY > 0 )
m_fRadian = g_PI/2 + g_PI/2 - m_fRadian;
// for ( INT nCntY = 0; nCntY < (_MAX_ELEC_NODEY+1); nCntY++ )
static int nCnt = 0;
nCnt++;
if ( nCnt >= 3 )
nCnt = 0;
if ( nCnt == 2 )
{
for ( INT nCntY = 1; nCntY < _MAX_ELEC_NODEY; nCntY++ )
{
// FLOAT fRandX = _RAND_FLOAT*1.3f - 1.0f;
FLOAT fRandX = _RAND_FLOAT*0.8f - 0.4f;
FLOAT fRandY = _RAND_FLOAT*0.2f;
for ( INT nCntX = 0; nCntX < (_MAX_ELEC_NODEX+1); nCntX++ )
{
m_avElec[nCntY][nCntX].x = m_avSaveElec[nCntY][nCntX].x+fRandX;
// m_avElec[nCntY][nCntX].y = m_avSaveElec[nCntY][nCntX].y+fRandY;
}
}
}
/*
CHAR szBuff[MAX_PATH];
sprintf(szBuff, "->扼叼救:[%f] %f", m_fRadian, fDiv);
g_xMainWnd.PutsHan(g_xMainWnd.GetBackBuffer(), 0, 100, RGB(250, 125, 0), RGB(0, 0, 0), szBuff);
*/
}
HRESULT CElec::RenderElec(LPDIRECT3DDEVICE7 lpDevice)
{
if ( lpDevice )
{
if( SUCCEEDED(lpDevice->BeginScene()) )
{
D3DMATRIX matWorldOriginal;
D3DMATRIX matTrans;
D3DMATRIX matScale;
D3DMATRIX matRot;
D3DMATRIX matTmpWorld;
D3DMATRIX matWorld;
D3DVECTOR vTrans;
D3DMATERIAL7 mtrl;
lpDevice->GetTransform(D3DTRANSFORMSTATE_WORLD, &matWorldOriginal);
D3DUtil_InitMaterial(mtrl,
(FLOAT)200/255.0f,
(FLOAT)200/255.0f,
(FLOAT)255/255.0f);
mtrl.diffuse.a = 0.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_shPosX-400;
vTrans.y = (FLOAT)-m_shPosY+300;
vTrans.z = (FLOAT)0;
D3DUtil_SetRotateZMatrix(matRot, m_fRadian);
// D3DUtil_SetRotateZMatrix(matRot, g_PI*2/2);
D3DUtil_SetTranslateMatrix(matTrans, vTrans);
D3DUtil_SetScaleMatrix(matScale, 128/2, 512 , 1);
D3DMath_MatrixMultiply(matTmpWorld, matRot, matTrans);
D3DMath_MatrixMultiply(matWorld, matScale, matTmpWorld);
lpDevice->SetTransform(D3DTRANSFORMSTATE_WORLD, &matWorld);
// lpDevice->SetTexture(0, NULL);
lpDevice->SetTexture(0, D3DTextr_GetSurface(m_szElecFile[0]));
// lpDevice->SetRenderState(D3DRENDERSTATE_LIGHTING, FALSE);
lpDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,
D3DFVF_VERTEX,
m_avElec, _ELEC_VERTICES,
m_pwElecIndices, _ELEC_INDICES, NULL);
/* lpDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,
D3DFVF_LVERTEX,
m_avElec, _ELEC_VERTICES,
m_pwElecIndices, _ELEC_INDICES, NULL);
*/
lpDevice->SetTransform(D3DTRANSFORMSTATE_WORLD, &matWorldOriginal);
// lpDevice->SetRenderState(D3DRENDERSTATE_LIGHTING, TRUE);
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->EndScene();
return S_OK;
}
}
return E_FAIL;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -