⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 particle.cpp

📁 好游戏的客户端原码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
	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 + -