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

📄 effectmanager.cpp

📁 国外网游源码....除工具源码缺少之外,其余程序都全...至于,什么游戏,因为国内还没有,所以找不到测试
💻 CPP
字号:
// EffectManager.cpp: implementation of the CEffectManager class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"

#include "BaseEffect.h"
#include "FireEffect.h"
#include "ScrapEffect.h"
#include "HitEffect.h"

#include "MCGTimer.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CEffectManager::CEffectManager()
{
	m_ListFirst = NULL;
	m_ListLast = NULL;
	m_ListCurrent = NULL;

	m_pMaterials = NULL;
	
	CreateEffect();
}

CEffectManager::~CEffectManager()
{
	DeleteAllList();
	
	mapEffect::iterator Itor;
	for (Itor = m_mapEffect.begin(); Itor != m_mapEffect.end(); Itor++)
	{
		CBaseEffect * pEffect = (CBaseEffect*)(*Itor).second;
		SAFE_DELETE(pEffect);
	}
	m_mapEffect.clear();
}

HRESULT CEffectManager::CreateEffect()
{

	CBaseEffect * pEffect = new CFireEffect;
	pEffect->Create();
	m_mapEffect.insert(std::make_pair( (WORD)FIRE_EFFECT_1, pEffect));

	pEffect = new CScrapEffect;
	pEffect->Create();
	m_mapEffect.insert(std::make_pair( (WORD)SCRAP_EFFECT_1, pEffect));
	
	pEffect = new CHitEffect;
	pEffect->Create();
	m_mapEffect.insert(std::make_pair( (WORD)DECAL_EFFECT_1, pEffect));

//	CFireEffect * pEffect = new CFireEffect;
//	pEffect->Create();
//	m_mapEffect.insert(std::make_pair( (WORD)FIRE_EFFECT_1, pEffect));
	return S_OK;
}

HRESULT CEffectManager::InvalidateDeviceObjects()
{
	mapEffect::iterator Itor;
	for (Itor = m_mapEffect.begin(); Itor != m_mapEffect.end(); Itor++)
	{
		CBaseEffect * pEffect = (CBaseEffect*)(*Itor).second;
		pEffect->Invalidate();
	}

	return S_OK;
}

HRESULT CEffectManager::RestoreDeviceObjects()
{
//	// 颇萍努.. 
//	if(FAILED( g_pApp->GetD3dDevice()->CreateVertexBuffer( sizeof(VERTEX_PARTICLE),
//									0, D3DFVF_PARTICLE,D3DPOOL_DEFAULT, &m_pVBParticle, NULL) ))
//	{
//		OutputDebugString("[角菩] CMD3Mesh::CreateVertexBuffer");
//		return E_FAIL;
//	}
//	// 颇萍努.. 
//	if(FAILED( g_pApp->GetD3dDevice()->CreateVertexBuffer(m_dwPDiscard* sizeof(VERTEX_PARTICLE),
//									D3DUSAGE_DYNAMIC|D3DUSAGE_WRITEONLY|D3DUSAGE_POINTS,
//									D3DFVF_PARTICLE,D3DPOOL_DEFAULT, &m_pVBParticle, NULL) ))
//	{
//		OutputDebugString("[角菩] CMD3Mesh::CreateVertexBuffer");
//		return E_FAIL;
//	}

	mapEffect::iterator Itor;
	for (Itor = m_mapEffect.begin(); Itor != m_mapEffect.end(); Itor++)
	{
		CBaseEffect * pEffect = (CBaseEffect*)(*Itor).second;
		pEffect->Restore();
	}
	return S_OK;
}

HRESULT CEffectManager::AddEffectSys( CEffect * pEffect )
{
	if(m_mapEffect.find(pEffect->GetEffectIndex()) == m_mapEffect.end())
	{
		OutputDebugString("[角菩] CEffectManager::Find Effect");
		return E_FAIL;
	}

	if(pEffect->GetEffectIndex() == DECAL_EFFECT_1)
	{
		CBaseEffect * pBaseEffect = m_mapEffect[pEffect->GetEffectIndex()];
		D3DXVECTOR3 vPos(0.0f,0.0f,0.0f);
		D3DXVECTOR3 vDir(0.0f,0.0f,0.0f);
		pBaseEffect->SetEmitter( pEffect, vPos, vDir, 0 );
		return S_OK;
	}

	EFFECTLIST * pList = new EFFECTLIST;
	pList->pEffect = pEffect;
	pList->pBaseEffect = m_mapEffect[pEffect->GetEffectIndex()];
	//pList->pBaseEffect->SetEmitter(pList->pEffect->m_vStart,pList->pEffect->m_vDir,0);
	pEffect->Start();
	D3DXVECTOR3 vPos = pEffect->Pos();
	D3DXVECTOR3 vDir = pEffect->Dir();
	pList->pBaseEffect->SetEmitter(pEffect,vPos,vDir,0);
	AddList(pList);

	return S_OK;
}

CBaseEffect * CEffectManager::GetEffect( int nIndex )
{
	if(m_mapEffect.find(nIndex) == m_mapEffect.end())
	{
		OutputDebugString("[角菩] CEffectManager::Find Effect");
		return NULL;
	}

	return m_mapEffect[nIndex];
}

void CEffectManager::UpdateEffect( float fElapsedTime )
{
	if(m_ListFirst)		// 怖 捞逞阑 且鞘夸 绝阑淀 窍促..
	{
		EFFECTLIST * pList = m_ListFirst;
		EFFECTLIST * pParentList = NULL;
		while(pList)
		{
			CEffect * pEffect = pList->pEffect;
			//CEffect * pEffect = pList->pEffect;
			if(pEffect){
				pList->pBaseEffect->Update(fElapsedTime);
				if(FAILED(pEffect->Update(fElapsedTime)))
				{
					pList = DeleteList( pList, pParentList );
					continue;
				}
			}else{
				pList = DeleteList( pList, pParentList );
				continue;
			}
			pParentList = pList;
			pList = pList->pNext;
		}
	}

//	if(m_ListFirst)
//	{
//		EFFECTLIST * pList = m_ListFirst;
//		EFFECTLIST * pParentList = NULL;
//		while(pList)
//		{
//			CEffect * pEffect = pList->pEffect;
//			CBaseEmitter * pEmitter = pEffect->GetUnit();
//			if(pEmitter){
//				if(FAILED(pEmitter->Update(fElapsedTime)))
//				{
//					pList = DeleteList( pList, pParentList );
//					continue;
//				}
//			}else{
//				pList = DeleteList( pList, pParentList );
//				continue;
//			}
//			pParentList = pList;
//			pList = pList->pNext;
//		}
//	}
}

void CEffectManager::RenderEffect()
{
	if(m_ListFirst)
	{
		EFFECTLIST * pList = m_ListFirst;
		while(pList)
		{
			CEffect * pEffect = pList->pEffect;
			//CBaseEmitter * pEmitter = (CBaseEmitter *)pEffect->GetUnit();
//			if(pEmitter)
//				pEmitter->Render();
			if( pEffect->GetEffectIndex() == DECAL_EFFECT_1 )
				assert(FALSE);
			if( pEffect && pEffect->GetEffectIndex() != DECAL_EFFECT_1 )		// 困摹 蔼捞扼带瘤 扁鸥 殿殿 持备. 坊歹 窍磊..
			{
				if(pList->pBaseEffect)
				{
					pList->pBaseEffect->Render( pEffect->GetTimer(), pEffect->GetWorldMatrix());
				}
			}
			pList = pList->pNext;
		}
	}
	CBaseEffect * pBaseEffect = m_mapEffect[DECAL_EFFECT_1];
	D3DXMATRIX matTemp;
	pBaseEffect->Render( NULL, matTemp );
}

EFFECTLIST * CEffectManager::DeleteList( EFFECTLIST * pDelList, EFFECTLIST * pParent )
{
	EFFECTLIST * pNextList = pDelList->pNext;
	
	if( pDelList == m_ListFirst )
	{
		m_ListFirst = pNextList;
	}

	if( pDelList == m_ListLast )
	{
		m_ListLast = pParent;
	}

	if(pParent)
		pParent->pNext = pNextList;

	SAFE_DELETE(pDelList->pEffect);
	SAFE_DELETE(pDelList);
	return pNextList;
}

void CEffectManager::DeleteAllList()
{
	if(m_ListFirst)
	{
		EFFECTLIST * pList = m_ListFirst;
		while(pList)
		{
			EFFECTLIST * pDelList = pList;
			m_ListFirst = pList = pList->pNext;
			pDelList->pBaseEffect = NULL;
			SAFE_DELETE(pDelList->pEffect);
			SAFE_DELETE(pDelList);
		}
		m_ListLast = NULL;
	}
}

void CEffectManager::AddList( EFFECTLIST * pCurrent )
{
	if(!m_ListFirst)
	{
		m_ListFirst = m_ListLast = pCurrent;
	}
	
	m_ListLast->pNext = pCurrent;
	m_ListLast = pCurrent;
	m_ListLast->pNext = NULL;
}

⌨️ 快捷键说明

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