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

📄 particle.cpp

📁 好游戏的客户端原码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
/******************************************************************************************************************
                                                                                                                   
	葛碘疙:																											
																													
	累己磊:																											
	累己老:																											
																													
	[老磊][荐沥磊] : 荐沥 郴侩																						
                                                                                                                   
*******************************************************************************************************************/
#include "StdAfx.h"



/******************************************************************************************************************

	CParticleSystem Class	

*******************************************************************************************************************/
CParticleSystem::CParticleSystem()
{
	InitSystem();
}


CParticleSystem::~CParticleSystem()
{
	DestroySystem();
}


VOID CParticleSystem::InitSystem()
{
	m_wNum			 = 0;		
	m_pxParticle	 = NULL;
	m_fDeltaTime	 = 0.02f;

	m_fAirFiction	 = -0.05f;
	m_vecBounding[0] = D3DVECTOR(0, 0, 0);
	m_vecBounding[1] = D3DVECTOR(0, 0, 0);
	m_vecEnvironment = D3DVECTOR(0, 300, 0);

	D3DVECTOR vNorm(0, 0, -1);
	m_avShape[0] = D3DVERTEX(D3DVECTOR(-0.5f,-0.5f, 0.0f ), vNorm, 0.0f, 1.0f);
	m_avShape[1] = D3DVERTEX(D3DVECTOR( 0.5f,-0.5f, 0.0f ), vNorm, 0.0f, 0.0f);
	m_avShape[2] = D3DVERTEX(D3DVECTOR(-0.5f, 0.5f, 0.0f ), vNorm, 1.0f, 1.0f);
	m_avShape[3] = D3DVERTEX(D3DVECTOR( 0.5f, 0.5f, 0.0f ), vNorm, 1.0f, 0.0f);
}


VOID CParticleSystem::SetupSystem(WORD wCnt)
{
	InitSystem();
	m_wNum = wCnt;
    m_pxParticle = new CParticle[m_wNum];

	for ( INT nCnt = 0; nCnt < m_wNum; nCnt++ )
	{
		m_pxParticle[nCnt].Init();
	}
}


VOID CParticleSystem::DestroySystem()
{
	SAFE_DELETE(m_pxParticle);
	InitSystem();
}


VOID CParticleSystem::UpdateAirFiction(WORD wNum)
{
	if ( !m_pxParticle[wNum].m_bIsDead )
	{
		m_pxParticle[wNum].m_vecLocalForce.x = -m_pxParticle[wNum].m_vecVel.x * m_fAirFiction;
		m_pxParticle[wNum].m_vecLocalForce.y = -m_pxParticle[wNum].m_vecVel.y * m_fAirFiction;
		m_pxParticle[wNum].m_vecLocalForce.z = m_pxParticle[wNum].m_vecVel.z * m_fAirFiction;
	}
}


VOID CParticleSystem::UpdateMove(WORD wNum)
{
	if ( !m_pxParticle[wNum].m_bIsDead )
	{
		m_pxParticle[wNum].m_vecAccel.x += (m_vecEnvironment.x + m_pxParticle[wNum].m_vecLocalForce.x) / m_pxParticle[wNum].m_fMass;
		m_pxParticle[wNum].m_vecAccel.y += (m_vecEnvironment.y + m_pxParticle[wNum].m_vecLocalForce.y) / m_pxParticle[wNum].m_fMass;
		m_pxParticle[wNum].m_vecAccel.z += (m_vecEnvironment.z + m_pxParticle[wNum].m_vecLocalForce.z) / m_pxParticle[wNum].m_fMass;

		m_pxParticle[wNum].m_vecVel.x += m_pxParticle[wNum].m_vecAccel.x * m_fDeltaTime;//*0.01f;
		m_pxParticle[wNum].m_vecVel.y += m_pxParticle[wNum].m_vecAccel.y * m_fDeltaTime;//*0.01f;
		m_pxParticle[wNum].m_vecVel.z += m_pxParticle[wNum].m_vecAccel.z * m_fDeltaTime;//*0.01f;

		m_pxParticle[wNum].m_vecOldPos = m_pxParticle[wNum].m_vecPos;

		m_pxParticle[wNum].m_vecPos.x += m_pxParticle[wNum].m_vecVel.x * m_fDeltaTime;//*0.01f;
		m_pxParticle[wNum].m_vecPos.y += m_pxParticle[wNum].m_vecVel.y * m_fDeltaTime;//*0.01f;
		m_pxParticle[wNum].m_vecPos.z += m_pxParticle[wNum].m_vecVel.z * m_fDeltaTime;//*0.01f;
	}
}


VOID CParticleSystem::UpdateCrash(WORD wNum)
{
	if ( !m_pxParticle[wNum].m_bIsDead )
	{
		if ( m_pxParticle[wNum].m_vecPos.x <= m_vecBounding[0].x || m_pxParticle[wNum].m_vecPos.x >= m_vecBounding[1].x )
		{	
			m_pxParticle[wNum].m_vecVel.x = -m_pxParticle[wNum].m_vecVel.x * 0.7f;
		}

		if ( m_pxParticle[wNum].m_vecPos.y <= m_vecBounding[0].y || m_pxParticle[wNum].m_vecPos.y >= m_vecBounding[1].y )
		{
			FLOAT fOldX = m_pxParticle[wNum].m_vecPos.x - m_pxParticle[wNum].m_vecVel.x * m_pxParticle[wNum].m_wDelay;
			FLOAT fOldY = m_pxParticle[wNum].m_vecPos.y - m_pxParticle[wNum].m_vecVel.y * m_pxParticle[wNum].m_wDelay;
			
			FLOAT fBefore = m_pxParticle[wNum].m_wDelay * (m_vecBounding[1].y - fOldY)/(m_pxParticle[wNum].m_vecPos.y - fOldY);							// 面倒傈.
			FLOAT fAfter  = m_pxParticle[wNum].m_wDelay * (m_pxParticle[wNum].m_vecPos.y - m_vecBounding[1].y)/(m_pxParticle[wNum].m_vecPos.y - fOldY);	// 面倒饶.
			
			m_pxParticle[wNum].m_vecPos.x = fOldX + m_pxParticle[wNum].m_vecVel.x * fBefore;
			m_pxParticle[wNum].m_vecPos.y = fOldY + m_pxParticle[wNum].m_vecVel.y * fBefore;
			
			m_pxParticle[wNum].m_vecVel.y = -m_pxParticle[wNum].m_vecVel.y * 0.6f;
			
			m_pxParticle[wNum].m_vecPos.x += m_pxParticle[wNum].m_vecVel.x * fAfter;
			m_pxParticle[wNum].m_vecPos.y += m_pxParticle[wNum].m_vecVel.y * fAfter;			
		}

		if ( m_pxParticle[wNum].m_vecPos.z <= m_vecBounding[0].z || m_pxParticle[wNum].m_vecPos.z >= m_vecBounding[1].y )
		{
			m_pxParticle[wNum].m_vecVel.z = -m_pxParticle[wNum].m_vecVel.z * 0.6f;
		}
	}
}






/******************************************************************************************************************

	CSnow Class	

*******************************************************************************************************************/
CSnow::CSnow()
{
	InitSystem();
}


CSnow::~CSnow()
{
	DestroySystem();
}


VOID CSnow::LoadTextr()
{
	CHAR* szFileList[] = 
	{
		"Snow0.bmp",
/*		"0000.bmp",
		"0001.bmp",
		"0002.bmp",
		"0003.bmp",
*/
/*		"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_SNOWFRAME; nCnt++ )
	{
		strcpy(m_szSnowFile[nCnt], szFileList[nCnt]);
		D3DTextr_CreateTextureFromFile(m_szSnowFile[nCnt]);
		D3DTextr_Restore(m_szSnowFile[nCnt], g_xMainWnd.Get3DDevice());
	}
}


VOID CSnow::InitSystem()
{
	CParticleSystem::InitSystem();
	m_fWidth = m_fGround = 0.0f;
	ZeroMemory(m_szSnowFile, _MAX_SNOWFRAME*MAX_PATH);
}


VOID CSnow::DestroySystem()
{
	CParticleSystem::DestroySystem();

	for ( INT nCnt = 0; nCnt < _MAX_SNOWFRAME; nCnt++ )
	{
		D3DTextr_Invalidate(m_szSnowFile[nCnt]);
		D3DTextr_DestroyTexture(m_szSnowFile[nCnt]);
	}

	InitSystem();
}


VOID CSnow::SetupSystem(WORD wCnt, FLOAT fWidth, FLOAT fGround)
{
	InitSystem();
	CParticleSystem::SetupSystem(wCnt);

	m_fWidth  = fWidth;
	m_fGround = fGround;
	LoadTextr();

	SetEnvFactor(-0.05f, D3DVECTOR(10, 100, 0));
}


VOID CSnow::UpdateSystem(INT nLoopTime, D3DVECTOR vecGenPos)
{
	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_vecPos.y >= m_fGround )
		{
			if( (m_pxParticle[nCnt].m_wCurrLife-m_pxParticle[nCnt].m_wLife) > 255 )
			{
				m_pxParticle[nCnt].m_bIsDead = TRUE;
			}
			else
			{
				BYTE bRate;
				bRate = 255 - (m_pxParticle[nCnt].m_wCurrLife-m_pxParticle[nCnt].m_wLife);

				m_pxParticle[nCnt].m_bOpa = bRate;
				
				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;

				continue;
			}
		}

		if ( m_pxParticle[nCnt].m_bIsDead && nGenCnt < 20 )
		{
			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++;

//				FLOAT fRand = _RAND_FLOAT;
//				SetEnvFactor(fRand, D3DVECTOR(-fRand, fRand*100, 0));

				if ( m_pxParticle[nCnt].m_wCurrFrame >= _MAX_SNOWFRAME )
				{
					m_pxParticle[nCnt].m_wCurrFrame = 0;
				}
			}
		}
    }
}


HRESULT CSnow::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, m_pxParticle[nCnt].m_fSize);
					D3DUtil_SetTranslateMatrix(matTrans, vTrans);
					D3DMath_MatrixMultiply(matWorld, matScale, matTrans);
					lpDevice->SetTransform(D3DTRANSFORMSTATE_WORLD, &matWorld);
					lpDevice->SetTexture(0, D3DTextr_GetSurface(m_szSnowFile[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 CSnow::SetParticleDefault(WORD wNum, D3DVECTOR vecGenPos)
{
    m_pxParticle[wNum].m_vecPos		= D3DVECTOR((FLOAT)GetRandomNum(0, m_fWidth)/*(-400, 1200)*/, (FLOAT)GetRandomNum(-300,  0), 0.0f);
    m_pxParticle[wNum].m_vecVel		= D3DVECTOR((FLOAT)GetRandomNum(-30,  30), (FLOAT)GetRandomNum(70, 100), 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(2500,  7000);
	m_pxParticle[wNum].m_fMass		= 1000 + _RAND_FLOAT;
	m_pxParticle[wNum].m_fSize		= (FLOAT)GetRandomNum(2, 6) + _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*/150, 200);
	m_pxParticle[wNum].m_bBlue		+= 50;
//	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		= 300;//(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;
}









/******************************************************************************************************************

	CRain Class	

*******************************************************************************************************************/
CRain::CRain()
{
	InitSystem();
}


CRain::~CRain()
{
	DestroySystem();
}


VOID CRain::LoadTextr()
{
	CHAR* szFileList1[] = 
	{
//		"Rain0.bmp",
		"Snow0.bmp",
	};
	CHAR* szFileList2[] = 
	{
		"RainDrop0.bmp",
		"RainDrop1.bmp",
		"RainDrop2.bmp",
		"RainDrop3.bmp",
		"RainDrop4.bmp",
	};
	for ( INT nCnt = 0; nCnt < _MAX_RAINFRAME; nCnt++ )
	{
		strcpy(m_pszRainFile[nCnt], szFileList1[nCnt]);
		D3DTextr_CreateTextureFromFile(m_pszRainFile[nCnt]);
		D3DTextr_Restore(m_pszRainFile[nCnt], g_xMainWnd.Get3DDevice());
	}
	for ( nCnt = 0; nCnt < _MAX_RAINDROPFRAME; nCnt++ )
	{
		strcpy(m_pszRainDropFile[nCnt], szFileList2[nCnt]);
		D3DTextr_CreateTextureFromFile(m_pszRainDropFile[nCnt]);
		D3DTextr_Restore(m_pszRainDropFile[nCnt], g_xMainWnd.Get3DDevice());
	}
}


VOID CRain::InitSystem()
{
	CParticleSystem::InitSystem();
	m_fWidth = m_fGround = 0.0f;
	m_bRainIntensity = 0;
	m_bGenCnt = 10;
	ZeroMemory(m_pszRainFile, _MAX_RAINFRAME*MAX_PATH);
	ZeroMemory(m_pszRainDropFile, _MAX_RAINDROPFRAME*MAX_PATH);
}


VOID CRain::DestroySystem()
{
	CParticleSystem::DestroySystem();

	for ( INT nCnt = 0; nCnt < _MAX_RAINFRAME; nCnt++ )
	{
		D3DTextr_Invalidate(m_pszRainFile[nCnt]);
		D3DTextr_DestroyTexture(m_pszRainFile[nCnt]);
	}
	for ( nCnt = 0; nCnt < _MAX_RAINDROPFRAME; nCnt++ )
	{
		D3DTextr_Invalidate(m_pszRainDropFile[nCnt]);
		D3DTextr_DestroyTexture(m_pszRainDropFile[nCnt]);
	}
	InitSystem();
}


VOID CRain::SetupSystem(WORD wCnt, FLOAT fWidth, FLOAT fGround)
{
	InitSystem();
	CParticleSystem::SetupSystem(wCnt);

	m_fWidth  = fWidth;
	m_fGround = fGround;
	LoadTextr();

	SetEnvFactor(-0.05f, D3DVECTOR(10, 100, 0));
}


VOID CRain::UpdateSystem(INT nLoopTime, D3DVECTOR vecGenPos)
{
	INT nGenCnt = 0; 
	INT nSpeedRate = (nLoopTime / 17);
	if ( nSpeedRate < 1 ) 		

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -