www.pudn.com > GameEngine_src.rar > CResourceManager.cpp


 
#include "CResourceManager.h" 
#include "CEPKFile.h" 
#include "BaseUtil.h" 
#include  
#include  
 
/* 
extern PEASYDRAW g_pEasyDraw; 
 
////////////////////////////////////////////////////////////////////// 
// 
////////////////////////////////////////////////////////////////////// 
CResourceManager::CResourceManager() 
{ 
 
} 
 
CResourceManager::~CResourceManager() 
{ 
 
} 
 
 
 
////////////////////////////////////////////////////////////////////// 
//初始化,只在程序开始时调用,关卡切换时不用 
////////////////////////////////////////////////////////////////////// 
bool CResourceManager::Init() 
{ 
	bool b = m_CommonEPGArray.Init( 64 ); 
	if ( !b ) return false; 
 
	b = m_CommonEPGNameArray.Init( 64 ); 
	if ( !b ) return false; 
 
	b = m_LvlEPGPool.Init( 128 ); 
	if ( !b ) return false; 
 
	b = m_LvlEPGTable.Init( 128 ); 
	if ( !b ) return false; 
 
	PSURFACE bk_surf = g_pEasyDraw->CreateSurface( "..\\data\\common\\loadingbar_bk.bmp", false, 0 ); 
	if ( bk_surf == NULL )	return false; 
	PSURFACE ft_surf = g_pEasyDraw->CreateSurface( "..\\data\\common\\loadingbar_ft.bmp", false, 0 ); 
	if ( ft_surf == NULL )	return false; 
 
	POINT p = { 8, 9 }; 
	m_LoadingBar.Init( bk_surf, ft_surf, p ); 
 
	return true; 
} 
 
 
////////////////////////////////////////////////////////////////////// 
// 
////////////////////////////////////////////////////////////////////// 
void CResourceManager::Free() 
{ 
	m_LoadingBar.Free(); 
	m_CommonEPGArray.Free(); 
	m_CommonEPGNameArray.Free(); 
 
	m_LvlEPGPool.Free(); 
	m_LvlEPGTable.Free(); 
} 
 
////////////////////////////////////////////////////////////////////// 
// 
////////////////////////////////////////////////////////////////////// 
bool CResourceManager::LoadCommonEPG( char *filename, CPictureGroup **pPG, CPictureGroup **pSPG ) 
{ 
 
	EPG_DATA *epg = NULL; 
	int index = m_CommonEPGNameArray.Find( filename ); 
	if ( index < 0 ) 
	{ 
		char sz[64]; 
		ZeroMemory( sz, 64 ); 
		strcpy( sz, "..\\data\\common\\" ); 
		strcat( sz, filename ); 
 
		epg = m_CommonEPGArray.CreateOneElement(); 
		if ( epg->m_animation.LoadEPG( sz, true, epg->GetShadow(), NULL, NULL ) == false ) 
		{ 
			m_CommonEPGArray.DeleteLastElement(); 
			return false; 
		} 
 
		m_CommonEPGNameArray.Add( filename ); 
	} 
	else 
	{ 
		epg = &m_CommonEPGArray[index]; 
	} 
 
	*pPG = epg->GetAnimation(); 
	if ( pSPG != NULL )		*pSPG= epg->GetShadow(); 
	return true; 
}	 
 
 
////////////////////////////////////////////////////////////////////// 
// 
////////////////////////////////////////////////////////////////////// 
bool CResourceManager::LoadEPG( char *filename, CPictureGroup **ppPG, CPictureGroup **ppSPG ) 
{ 
	EPG_INFO epg_info; 
	EPG_DATA *p_epg_data; 
	epg_info.m_szName = filename; 
	EPG_INFO *p = m_LvlEPGTable.Find( epg_info ); 
 
	if ( p == NULL ) 
	{ 
		//Warn( "not found" ); 
		char sz[64]; 
		ZeroMemory( sz, 64 ); 
		strcpy( sz, "..\\data\\animation\\" ); 
		strcat( sz, filename ); 
 
		p_epg_data = m_LvlEPGPool.Alloc(); 
		assert( p_epg_data != NULL ); 
 
		bool b = p_epg_data->m_animation.LoadEPG( sz, true, p_epg_data->GetShadow(), NULL, NULL ); 
		if ( b == false ) 
		{ 
			m_LvlEPGPool.Free( p_epg_data ); 
			return false; 
		} 
 
		epg_info.m_pData = p_epg_data; 
		b = m_LvlEPGTable.Insert( epg_info ); 
		assert( b == true ); 
	} 
	else 
	{ 
		p_epg_data = p->m_pData;  
	} 
 
	*ppPG = p_epg_data->GetAnimation(); 
	if ( ppSPG != NULL )		*ppSPG= p_epg_data->GetShadow(); 
	return true; 
} 
 
////////////////////////////////////////////////////////////////////// 
// 
////////////////////////////////////////////////////////////////////// 
bool CResourceManager::FindEPG( const char *filename, CPictureGroup **ppPG, CPictureGroup **ppSPG ) 
{ 
	EPG_INFO epg_info; 
	epg_info.m_szName = filename; 
 
	EPG_INFO *p = m_LvlEPGTable.Find( epg_info ); 
 
	assert( p != NULL ); 
 
	*ppPG = p->m_pData->GetAnimation(); 
	if ( ppSPG != NULL )		 
		*ppSPG= p->m_pData->GetShadow(); 
	return true; 
} 
 
 
////////////////////////////////////////////////////////////////////// 
// 
////////////////////////////////////////////////////////////////////// 
void CResourceManager::AddEPG( char *filename ) 
{ 
	string name = filename; 
	m_LoadingList.Add( name ); 
	m_NumLoad = m_LoadingList.GetLength(); 
} 
 
 
////////////////////////////////////////////////////////////////////// 
//在退出一个关卡时,释放关卡资源,并不是真的释放,而是全部标记为无用 
//在载入下一个关卡时,再载入不存在的资源,并真正释放无用的资源 
//如此避免资源重复载入 
////////////////////////////////////////////////////////////////////// 
void CResourceManager::FreeLvl() 
{ 
	for ( m_LvlEPGPool.Begin(); m_LvlEPGPool.IsNotNull(); m_LvlEPGPool.MoveNext() ) 
		m_LvlEPGPool.GetCur()->SetUseful(false); 
} 
 
 
////////////////////////////////////////////////////////////////////// 
//在载入关卡时,每次主循环调用 
//如果载入完毕,返回true 
////////////////////////////////////////////////////////////////////// 
bool CResourceManager::OnLoadingLvl() 
{ 
	if ( m_LoadingList.IsEmpty() == false ) 
	{ 
		EPG_INFO epg_info; 
		epg_info.m_szName = m_LoadingList[m_LoadingList.GetLength()-1]; 
		m_LoadingList.DeleteLastElement(); 
 
		EPG_INFO *p = m_LvlEPGTable.Find( epg_info ); 
 
		if ( p != NULL ) 
		{ 
			//首先查找要载入的资源是否还在,如果在则标记"有用" 
			p->m_pData->SetUseful( true );	 
		} 
		else 
		{ 
			//如果不在,则载入 
			char sz[64]; 
			ZeroMemory( sz, 64 ); 
			strcpy( sz, "..\\data\\animation\\" ); 
			strcat( sz, epg_info.m_szName.c_str() ); 
 
			EPG_DATA * p_epg_data = m_LvlEPGPool.Alloc();	//分配,自动设为Useful 
			assert( p_epg_data != NULL ); 
 
			//载入 
			bool b = p_epg_data->m_animation.LoadEPG( sz, true, p_epg_data->GetShadow(), NULL, NULL ); 
			if ( b == false ) 
			{ 
				m_LvlEPGPool.Free( p_epg_data );			//如果载入不成功 
				assert(false); 
			} 
 
			epg_info.m_pData = p_epg_data; 
			b = m_LvlEPGTable.Insert( epg_info );			//插入哈希表中 
			assert( b == true ); 
		} 
 
		m_LoadingBar.Draw( 200, 450, m_NumLoad-m_LoadingList.GetLength(), m_NumLoad ); 
		return false; 
	} 
	else	//如果列表中的EPG全部载入完毕,把无用的资源清除 
	{ 
		CDynamicArray temp_epg_info_array; 
 
		for ( m_LvlEPGTable.Begin(); m_LvlEPGTable.IsNotEnd(); m_LvlEPGTable.MoveNext() ) 
		{ 
			if ( m_LvlEPGTable.GetCur()->m_pData->IsUseful() ) 
			{ 
				EPG_INFO *epg_info = temp_epg_info_array.CreateOneElement(); 
				epg_info->m_pData = m_LvlEPGTable.GetCur()->m_pData; 
				epg_info->m_szName= m_LvlEPGTable.GetCur()->m_szName; 
			} 
			else 
			{ 
				m_LvlEPGPool.Free( m_LvlEPGTable.GetCur()->m_pData ); 
			} 
		} 
 
		//清除哈希表,并重哈希 
		m_LvlEPGTable.Clear(); 
		for ( int i = 0; i < temp_epg_info_array.GetLength(); ++i ) 
		{ 
			m_LvlEPGTable.Insert( temp_epg_info_array[i] ); 
		} 
		 
		return true; 
	}	 
} 
 
 
*/