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

📄 framemanager.cpp

📁 一个自己写的游戏引擎,用DirectX 写成
💻 CPP
字号:
//--------------------------------------------------
//  Desc: Frame Manager
//  Author: artsylee/2006.12.7
//--------------------------------------------------
#include "../stdafx.h"
#include "FrameManager.h"
#include "Log.h"

CFrameManager::CFrameManager()
{
	m_CurHandle = BASEHANDLE;
	m_UpdateTime = 0;
}

CFrameManager::~CFrameManager()
{
	DestroyAll();
}

//---------------------------------------------------
// 加载Frame组到管理器
//---------------------------------------------------
FrameHandle	CFrameManager::LoadFrame(const char *szFilename, MemoryMode mode /* = MM_AUTO */)
{
	if(szFilename == NULL || szFilename[0] == 0)
	{
		return INVALID_HANDLE;
	}

	FrameHandle hFrm = QueryHandle(szFilename);
	if(hFrm == INVALID_HANDLE)
	{
		CFrames * pFrame = new CFrames;
		if(!pFrame->LoadFrame(szFilename))
		{
			delete (pFrame);
			return INVALID_HANDLE;
		}
		pFrame->SetMemMode(mode);
		hFrm = CreateHandle();
		m_FrameMap.insert(std::map<FrameHandle, CFrames*>::value_type(hFrm, pFrame));
	}
	return hFrm;
}

//---------------------------------------------------
// 加载Frame组的描述到管理器
//---------------------------------------------------
FrameHandle	CFrameManager::LoadFrameDesc(const char *szFilename)
{
	if(szFilename == NULL || szFilename[0] == 0)
	{
		return INVALID_HANDLE;
	}

	FrameHandle hFrm = QueryHandle(szFilename);
	if(hFrm == INVALID_HANDLE)
	{
		CFrames * pFrame = new CFrames;
		if(!pFrame->LoadFrameDesc(szFilename))
		{
			delete (pFrame);
			return INVALID_HANDLE;
		}
		hFrm = CreateHandle();
		m_FrameMap.insert(std::map<FrameHandle, CFrames*>::value_type(hFrm, pFrame));
	}
	return hFrm;
}

//---------------------------------------------------
// 插入共享Frame组 (未加载后的也可以,最好使用MM_KEEPINMEMORY)
//---------------------------------------------------
FrameHandle	CFrameManager::InsertFrame(CFrames *pFrame, MemoryMode mode /* = MM_AUTO */)
{
	if(pFrame == NULL)
	{
		return INVALID_HANDLE;
	}
	pFrame->SetMemMode(mode);
	FrameHandle hFrm = CreateHandle();
	m_FrameMap.insert(std::map<FrameHandle, CFrames*>::value_type(hFrm, pFrame));
	return hFrm;
}

//---------------------------------------------------
// 指定句柄方式
//---------------------------------------------------
bool CFrameManager::LoadFrame(FrameHandle hFrm, const char *szFilename, MemoryMode mode /* = MM_AUTO */)
{
	if(szFilename == NULL || szFilename[0] == 0 || hFrm>BASEHANDLE)
	{
		WriteLog(INFO_ERROR, "Invalidate parameter!");
		return false;
	}
	if(m_FrameMap.find(hFrm) != m_FrameMap.end())
	{
		WriteLog(INFO_WARNING, "Frames Handle has been used![%s]", szFilename);
		return false;
	}
	CFrames * pFrame = new CFrames;
	if(!pFrame->LoadFrame(szFilename))
	{
		delete (pFrame);
		return false;
	}
	pFrame->SetMemMode(mode);
	m_FrameMap.insert(std::map<FrameHandle, CFrames*>::value_type(hFrm, pFrame));
	return true;
}

//---------------------------------------------------
// 指定句柄方式
//---------------------------------------------------
bool CFrameManager::LoadFrameDesc(FrameHandle hFrm, const char *szFilename)
{
	if(szFilename == NULL || szFilename[0] == 0 || hFrm>BASEHANDLE)
	{
		WriteLog(INFO_ERROR, "Invalidate parameter!");
		return false;
	}
	if(m_FrameMap.find(hFrm) != m_FrameMap.end())
	{
		WriteLog(INFO_WARNING, "Frames Handle has been used![%s]", szFilename);
		return false;
	}
	CFrames * pFrame = new CFrames;
	if(!pFrame->LoadFrameDesc(szFilename))
	{
		delete (pFrame);
		return false;
	}
	m_FrameMap.insert(std::map<FrameHandle, CFrames*>::value_type(hFrm, pFrame));
	return true;
}

//---------------------------------------------------
// 批加载
//---------------------------------------------------
bool CFrameManager::BatchLoad(const char *szIniFile)
{
	if(szIniFile == NULL || szIniFile[0] == 0)
	{
		return false;
	}
	FILE * fp = fopen(szIniFile, "r");
	if(!fp)
	{
		WriteLog(INFO_ERROR, "Can't open file[%s]!", szIniFile);
		return false;
	}

	int		nHandle, nInMem, nDesc;
	char	*TOKEN = " \t\n\r";
	char	*temp, szTemp[256];
	char    *szFilename;

	while(!feof(fp))
	{
		fgets(szTemp, 256, fp);
		if(szTemp[0] != '#')
		{
			szTemp[0]	= 0;
			continue;
		}
		temp = szTemp;
		++temp;
		nHandle	= atoi(strtok(temp, TOKEN));
		nInMem = atoi(strtok(0, TOKEN));
		nDesc = atoi(strtok(0, TOKEN));
		szFilename	= strtok(0, TOKEN);

		if(nInMem)
		{
			LoadFrame(nHandle, szFilename, MM_KEEPINMEMORY);
		}
		else
		{
			if(nDesc)	LoadFrameDesc(nHandle, szFilename);
			else		LoadFrame(nHandle, szFilename);
		}
	}
	fclose(fp);

	return true;
}

//---------------------------------------------------
// 释放纹理组
//---------------------------------------------------
void CFrameManager::ReleaseFrame(FrameHandle frmHandle)
{
	if(frmHandle==INVALID_HANDLE)
		return;
	std::map<FrameHandle, CFrames*>::iterator itor = m_FrameMap.find(frmHandle);
	if(itor != m_FrameMap.end())
	{
		if((*itor).second->Release()<=0)
		{
			delete ((*itor).second);
			m_FrameMap.erase(itor);
			return;
		}
	}
}

//---------------------------------------------------
// 删除纹理组
//---------------------------------------------------
void CFrameManager::DestroyFrame(FrameHandle frmHandle)
{
	if(frmHandle==INVALID_HANDLE)
		return;
	std::map<FrameHandle, CFrames*>::iterator itor = m_FrameMap.find(frmHandle);
	if(itor != m_FrameMap.end())
	{
		delete ((*itor).second);
		m_FrameMap.erase(itor);
		return;
	}
}

//---------------------------------------------------
// 删除全部纹理组
//---------------------------------------------------
void CFrameManager::DestroyAll(void)
{
	std::map<FrameHandle, CFrames*>::iterator itor = m_FrameMap.begin();
	while(itor!=m_FrameMap.end())
	{
		// 调用析构函数Destroy释放m_TextureVec
		delete ((*itor).second);
		itor++;
	}
	m_FrameMap.clear();
}

//---------------------------------------------------
// 获取索引纹理
//---------------------------------------------------
CTexture* CFrameManager::GetTexture(FrameHandle frmHandle, DWORD index)
{
	if(frmHandle==INVALID_HANDLE)
		return NULL;
	std::map<FrameHandle, CFrames*>::iterator itor = m_FrameMap.find(frmHandle);
	if(itor != m_FrameMap.end())
	{
		(*itor).second->SetLastAccess(::timeGetTime());
		return (*itor).second->GetTexture(index);
	}
	return NULL;
}

//---------------------------------------------------
// 获取纹理组
//---------------------------------------------------
CFrames* CFrameManager::GetFrame(FrameHandle frmHandle)
{
	if(frmHandle==INVALID_HANDLE)
		return NULL;
	std::map<FrameHandle, CFrames*>::iterator itor = m_FrameMap.find(frmHandle);
	if(itor != m_FrameMap.end())
	{
		(*itor).second->SetLastAccess(::timeGetTime());
		return (*itor).second;
	}
	return NULL;
}

//---------------------------------------------------
// 自动管理纹理组
//---------------------------------------------------
void CFrameManager::Update(void)
{
	DWORD tm = ::timeGetTime();
	if(tm - m_UpdateTime>UPDATETIME)
	{
		std::map<FrameHandle, CFrames*>::iterator itor = m_FrameMap.begin();
		while(itor != m_FrameMap.end())
		{
			if((tm-(*itor).second->GetLastAccess())>MAXEXIST 
				&& !((*itor).second->IsRelease())
				&& (*itor).second->GetMemMode()==MM_AUTO)
			{
				(*itor).second->AutoRemove();
			}
			itor++;
		}
		m_UpdateTime = tm;
	}
}

//---------------------------------------------------
// 创建唯一的共享句柄(5000+)
//---------------------------------------------------
FrameHandle CFrameManager::CreateHandle(void)
{
	m_CurHandle++;
	while(m_FrameMap.end() != m_FrameMap.find(m_CurHandle))
	{
		m_CurHandle++;
	}
	if(m_CurHandle==INVALID_HANDLE)
	{
		m_CurHandle = BASEHANDLE;
	}
	return m_CurHandle;
}

//---------------------------------------------------
// 查询共享句柄(5000+)
// 5000以下不参与共享
//---------------------------------------------------
FrameHandle CFrameManager::QueryHandle(const char *szFilename)
{
	std::map<FrameHandle, CFrames*>::iterator itor = m_FrameMap.begin();
	while(itor!=m_FrameMap.end())
	{
		if((*itor).second->GetName() == szFilename && (*itor).first>BASEHANDLE)
		{
			(*itor).second->AddRef();
			return (*itor).first;
		}
		itor++;
	}
	return INVALID_HANDLE;
}

//---------------------------------------------------
// copy right 2006 Artsylee(2006_12_8)
//---------------------------------------------------

⌨️ 快捷键说明

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