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

📄 resmgr.cpp

📁 PC网络游戏的编程
💻 CPP
字号:
// 资源管理代码
// 作者: Janhail Luo
// 最后整理: 2003-03-03
//////////////////////////////////////////////////////////////////////
#include "StdAfx.h"
#include "ResMgr.h"

CResMgr* CResObject::m_pResMgr = 0;

//////////////////////////////////////////////////////////////////////
// Class CResObject
//////////////////////////////////////////////////////////////////////

CResObject::CResObject()
{
    m_pData = 0;
    m_pName = 0;
}

CResObject::~CResObject()
{
    DestroyObject();
}

void CResObject::CreateObject(const char* pResName)
{
    // 如果资源管理类没有实例,就创建一个实例
    if (m_pResMgr==NULL)
    {
        m_pResMgr = new CResMgr();
    }

    // 如果当前对象中包含有资源,就销毁这个资源
    if (m_pData!=NULL)
    {
        this->DestroyObject();
    }

    // 注册这个资源
    m_pResMgr->RegisterRes(this, pResName);
}

void CResObject::DestroyObject()
{
    if (m_pResMgr!=NULL)
    {
        if (m_pData)
        {
            // 注销这个资源
            m_pResMgr->UnregisterRes(this);

            // 如果资源管理类里面没有保存任何资源
            if (m_pResMgr->Empty())
            {
                // 删掉资源管理类
                delete m_pResMgr;
                m_pResMgr = 0;
            }
            m_pData = 0;
            m_pName = 0;
        }
    }
}

void CResObject::OnDestroyObject()
{
}

void* CResObject::GetData()
{
    return m_pData;
}

const char* CResObject::GetName()
{
    return m_pName;
}

//////////////////////////////////////////////////////////////////////
// Class CResObject
//////////////////////////////////////////////////////////////////////

CResMgr::CResMgr()
{
}

CResMgr::~CResMgr()
{
}

void CResMgr::RegisterRes(CResObject* pResObj, const char* pName)
{
    // 资源的名字
    string name = pName;

    // 在列表中查找资源
    map<string, SItem>::iterator it = m_Item.find(name);

    // 如果找不到资源
    if (it==m_Item.end())
    {
        SItem item;

        // 创建一个资源
        item.pData = pResObj->OnCreateObject(pName);
        printf("Create resource: %s\n", pName);

        // 把创建的资源加入到资源列表中
        m_Item[name] = item;
        it = m_Item.find(name);
    }

    // 给对象的数据指针和名字指针赋值
    pResObj->m_pData = (*it).second.pData;
    pResObj->m_pName = (*it).first.c_str();

    // 把对象加入到使用资源的列表中
    (*it).second.objList.push_back(pResObj);
    printf("Insert res object\n");
}

void CResMgr::UnregisterRes(CResObject* pResObj)
{
    // 资源的名字
    string name;
    if (pResObj->m_pName==NULL) name = "";
    else name = pResObj->m_pName;

    // 取得使用资源的对象列表
    SItem* pItem = &(m_Item[name]);

    // 查找
    list<CResObject*>::iterator it;
    it = find(pItem->objList.begin(), pItem->objList.end(), pResObj);

    // 把查找到的对象删除
    pItem->objList.erase(it);
    printf("Remove res object\n");

    // 如果已经没有对象使用这个资源
    if (pItem->objList.empty())
    {
        // 销毁这个资源
        pResObj->OnDestroyObject();
        printf("Destroy resource: %s\n", pResObj->m_pName);
    }
}

bool CResMgr::Empty()
{
    return m_Item.empty();
}

⌨️ 快捷键说明

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