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

📄 particle.cpp

📁 好游戏的客户端原码
💻 CPP
📖 第 1 页 / 共 4 页
字号:


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 + -