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

📄 particle.cpp

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