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

📄 game3deffectex.cpp

📁 网络游戏魔域源代码 测试可以完整变异
💻 CPP
📖 第 1 页 / 共 2 页
字号:

		// get effect 
		C3DEffect* pEffect = g_objGameDataSet.Get3DEffect(pIDInfo->idEffect);
		if(!pEffect)
			return;

		// get txeture of effect
		C3DTexture* pTexture = g_objGameDataSet.Get3DTexture(pIDInfo->idTexture);
		if(!pTexture)
			return;

		// set the texture
		pEffect->SetTexture(pTexture);
		pEffect->SetFrames(pInfo->dwCurrentFrameIndex);

		// restore shape info
		pEffect->RestoreShapeInfo(pIDInfo->pShapeInfoBuf);

		// setpos
		if(pInfo->bSelfRotate)
			pEffect->Rotate(0, 0, pInfo->fDir);
		else
			pEffect->Rotate(m_fX, m_fY, m_fZ);
		pEffect->Move(0, pInfo->nOffsetZ, m_Height*1.4);
		if(m_bOblique)
			pEffect->Rotate ( D3DXToRadian ( -30.0f ), 0, 0 );
		pEffect->Move(posWorld.x + pInfo->nOffsetX, 0, posWorld.y + pInfo->nOffsetY);
		pEffect->Draw(false, pIDInfo->nASB, pIDInfo->nADB);

		pEffect->BackupShapeInfo(pIDInfo->pShapeInfoBuf);
	}
}

//-------------------------------------------------------------------
BOOL CGame3DEffectEx::Process(Game3DEffectExInfo* pInfo)
{
	int nAmount = pInfo->nInfoAmount;
	if(nAmount <= 0)
		return true;

	if(!pInfo)
		return true;
	
	int nMaxFrameAmount = 0;
	{
		Game3DEffectIdInfo* pIdInfo = pInfo->pIDInfo;
		if(pIdInfo)
		{
			C3DEffect* pEffect = g_objGameDataSet.Get3DEffect(pIdInfo->idEffect); 
			if(pEffect)
				nMaxFrameAmount = pEffect->GetFrames();
		}
	}

	/*
	for(int i = 0; i < pInfo->nInfoAmount; i++)
	{
		Game3DEffectIdInfo* pIdInfo = pInfo->pIDInfo + i;
		if(pIdInfo)
		{
			C3DEffect* pEffect = g_objGameDataSet.Get3DEffect(pIdInfo->idEffect); 
			if(pEffect && pEffect->GetFrames() > nMaxFrameAmount)
				nMaxFrameAmount = pEffect->GetFrames();
		}
	}
	*/

	// 看看死了没
	DWORD dwTimePass = ::TimeGet() - pInfo->dwTimeBegin;
	if(dwTimePass < pInfo->dwTimeDelay)
	{
		pInfo->bShow = false;
		return false;
	}
	
	dwTimePass -= pInfo->dwTimeDelay;
	DWORD dwAllTime = pInfo->dwLoopTime * (pInfo->dwFrameInterval*nMaxFrameAmount+pInfo->dwLoopInterval)-pInfo->dwLoopInterval;
	if(dwAllTime <= dwTimePass)
	{
		return true;
	}
	
	// 取祯数
	int nData = (pInfo->dwFrameInterval*nMaxFrameAmount+pInfo->dwLoopInterval);
	if(nData == 0)
		nData = 1;
	int nTime = (int)(dwTimePass/nData);
	DWORD dwTimePassThisLoop = dwTimePass - (pInfo->dwFrameInterval*nMaxFrameAmount+pInfo->dwLoopInterval)*nTime;
	int nFrameIndex = dwTimePassThisLoop/pInfo->dwFrameInterval;
	if(nFrameIndex >= nMaxFrameAmount)
	{
		pInfo->bShow = false;
	}
	else
	{
		pInfo->bShow = true;
		pInfo->dwCurrentFrameIndex = nFrameIndex;
	}
	return false;
}

//-------------------------------------------------------------------
BOOL CGame3DEffectEx::Process()
{
	int nAmount = m_setInfo.size();
	if(nAmount <= 0)
		return true;
	for(int i = nAmount-1; i >= 0; i --)
	{
		Game3DEffectExInfo* pInfo = m_setInfo[i];
		if(pInfo)
		{
			if(this->Process(pInfo))
			{
				// 结束
				this->Delete(pInfo->szIndex);
			}
		}
	}
	return false;
}

//-------------------------------------------------------------------
void CGame3DEffectEx::Clear()
{
	int nAmount = m_setInfo.size();
	for(int i = nAmount-1; i >= 0; i--)
	{
		Game3DEffectExInfo* pInfo = m_setInfo[i];
		if(pInfo->pIDInfo)
		{
			int nMyAmount = pInfo->nInfoAmount;
			for(int i = 0; i < nMyAmount; i ++)
			{
				Game3DEffectIdInfo* pMyInfo = pInfo->pIDInfo + i;
				if(pMyInfo)
					C3DEffect::DestroyShapeInfo(pMyInfo->pShapeInfoBuf, pMyInfo->nShapes);
			}

			delete[] pInfo->pIDInfo;
			pInfo->pIDInfo = NULL;
		}

		SAFE_DELETE(pInfo);
	}

	m_setInfo.clear();
}

//-------------------------------------------------------------------
void CGame3DEffectEx::DeleteByVMesh(char* pszVMesh)
{
	if(!pszVMesh)
		return;
	
	int nAmount = m_setInfo.size();
	for(int i= 0; i< nAmount; i++)
	{
		Game3DEffectExInfo* pInfo = m_setInfo[i];
		if(pInfo && NULL != strstr(pInfo->szIndex, pszVMesh))
		{
			// delete
			m_setInfo.erase(m_setInfo.begin()+i);
			if (pInfo->pIDInfo)
			{
				int nMyAmount = pInfo->nInfoAmount;
				for(int i = 0; i < nMyAmount; i ++)
				{
					Game3DEffectIdInfo* pMyInfo = pInfo->pIDInfo + i;
					if(pMyInfo)
						C3DEffect::DestroyShapeInfo(pMyInfo->pShapeInfoBuf, pMyInfo->nShapes);
				}
				
				delete[] pInfo->pIDInfo;
				pInfo->pIDInfo = NULL;
			}
			
			SAFE_DELETE(pInfo);
			return;
		}
	}
}
//-------------------------------------------------------------------
void CGame3DEffectEx::Delete(char* pszIndex)
{
	if(!pszIndex)
		return;

	int nAmount = m_setInfo.size();
	for(int i= 0; i< nAmount; i++)
	{
		Game3DEffectExInfo* pInfo = m_setInfo[i];
		if(pInfo && 0 == strcmp(pszIndex, pInfo->szIndex))
		{
			// delete
			m_setInfo.erase(m_setInfo.begin()+i);
			if (pInfo->pIDInfo)
			{
				int nMyAmount = pInfo->nInfoAmount;
				for(int i = 0; i < nMyAmount; i ++)
				{
					Game3DEffectIdInfo* pMyInfo = pInfo->pIDInfo + i;
					if(pMyInfo)
						C3DEffect::DestroyShapeInfo(pMyInfo->pShapeInfoBuf, pMyInfo->nShapes);
				}
				
				delete[] pInfo->pIDInfo;
				pInfo->pIDInfo = NULL;
			}

			SAFE_DELETE(pInfo);
			return;
		}
	}
}

//-------------------------------------------------------------------
void CGame3DEffectEx::Add(Game3DEffectExInfo* pInfo)
{
	if(!pInfo)
		return;
	m_setInfo.push_back(pInfo);
}

//-------------------------------------------------------------------
void CGame3DEffectEx::Add(char* pszIndex, BOOL bSelfRotate, int nDir)
{
	if(!pszIndex)
		return;
	if(strcmp(pszIndex, "none") == 0)
		return;
	if(strcmp(pszIndex, "null") == 0)
		return;
	const CMy3DEffectInfo* pEffectInfo = g_obj3DRoleData.GetMy3DEffectInfo(pszIndex);
	if (!pEffectInfo)
		return;

	Game3DEffectExInfo* pInfo = new Game3DEffectExInfo;
	MYASSERT (pInfo);
	memset(pInfo, 0L, sizeof(Game3DEffectExInfo));
	if(!bSelfRotate)
	{
		pInfo->bSelfRotate = false;
	}
	else
	{
		pInfo->bSelfRotate = true;
		pInfo->fDir = (float)(3.14159*9/4 - 3.14159*nDir/4);
	}
	pInfo->nInfoAmount = pEffectInfo->nAmount;

	pInfo->pIDInfo = new Game3DEffectIdInfo[pInfo->nInfoAmount];
	MYASSERT(pInfo->pIDInfo);

	for(int i = 0; i < pInfo->nInfoAmount; i++)
	{
		Game3DEffectIdInfo* pIDInfo = pInfo->pIDInfo+i;
		memset(pIDInfo, 0L, sizeof(Game3DEffectIdInfo));

		pIDInfo->idEffect		= pEffectInfo->idEffect[i];
		pIDInfo->idTexture		= pEffectInfo->idTexture[i];
		pIDInfo->nADB			= pEffectInfo->nADB[i];
		pIDInfo->nASB			= pEffectInfo->nASB[i];

		C3DEffect* pEffect = g_objGameDataSet.Get3DEffect(pIDInfo->idEffect);
		MYASSERT (pEffect);

		pEffect->ResetShape();

		pIDInfo->pShapeInfoBuf = pEffect->CreateShapeInfo();
		pIDInfo->nShapes = pEffect->GetShapeAmount();
		pEffect->BackupShapeInfo(pIDInfo->pShapeInfoBuf);
	}

	pInfo->dwTimeDelay	= pEffectInfo->nDelay;
	pInfo->dwLoopTime	= pEffectInfo->nLoopTime;
	pInfo->dwFrameInterval	= pEffectInfo->nFrameInterval;
	pInfo->dwLoopInterval	= pEffectInfo->nLoopInterval;
	pInfo->nOffsetX		= pEffectInfo->nOffsetX;
	pInfo->nOffsetY		= pEffectInfo->nOffsetY;
	pInfo->nOffsetZ		= pEffectInfo->nOffsetZ;
	pInfo->bShow		= true;

	strcpy(pInfo->szIndex, pszIndex);
	pInfo->dwTimeBegin = ::TimeGet();
	this->Add(pInfo);
}
//-----------------------------------------------------------------
void CGame3DEffectEx::EverPlay()
{
	int nAmount = m_setInfo.size();
	for(int i = 0; i < nAmount; i++)
	{
		Game3DEffectExInfo* pInfo = m_setInfo[i];
		if(pInfo)
		{
			pInfo->dwLoopTime = 99999999;
		}
	}
}
//-----------------------------------------------------------------
BOOL CGame3DEffectEx::TestEffect(char* pszIndex)
{
	if(!pszIndex)
		return false;
	int nAmount = m_setInfo.size();
	for(int i = 0; i < nAmount; i++)
	{
		Game3DEffectExInfo* pInfo = m_setInfo[i];
		if(pInfo)
		{
			if(strcmp(pInfo->szIndex, pszIndex) == 0)
				return true;
		}
	}
	return false;
}
//-----------------------------------------------------------------

⌨️ 快捷键说明

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