📄 effectmanager.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 + -