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; } } */