• CGameConfig类


    #ifndef __GAMECONFIG_H__
    #define __GAMECONFIG_H__
    
    #include "GameFrameHead.h"
    #include "GameParam.h"
    
    //生物配置
    struct BiontInfo
    {
        int        nId;
        int        nType;            //生物类型
        CCRect    rArea;            //生物活动区域
        int        nBulk;            //体积
        int        nWeight;        //重量
    
        string    strFile;        //贴图文件
        string    strAudio;        //声音文件
        string    strAction;        //动作
        int        nTag;            //标签
        string  strLap;            
        int        nDirect;        //方向
    
        enum DirectType
        {
            _Normal = 0,
            _Reverse =1,
            _Both   = 2,
        };
    
    };
    
    
    struct MapInfo
    {
        int nId;
        vector<CCPoint>    foundationPos;
        vector<CCPoint> path;
        
    };
    
    
    class CGameConfig
    {
    public:
        ~CGameConfig();
    
        static CGameConfig* getInstance();
        static void destroy();
        void release();
    
        //设置资源路径  一开始就要设定
        void    setResourcePath(const char* psPath);
        string    getResourcePath();
    public:
    
        bool                loadBiontInfo(); //生物配置
        bool                loadMapInfo(); //地图配置
    
        vector<BiontInfo>*    getBiontInfo();
        BiontInfo*            getBiontInfoByType(int nType);
    
    
        map<int, MapInfo>*    getMapInfo();
        MapInfo*            getMapInfoById(int nId);
    
    
    private:
        CGameConfig(); 
    private:
        static CGameConfig* g_pGameConfig;
        string                m_strResourcePath;
    
    private:
    
        //生物配置标识
        vector<BiontInfo>    m_vecBiontInfo;
    
        //地图配置
        map<int, MapInfo>    m_mapMapInfo; 
    
    };
    
    #endif //__GAMECONFIG_H__
    #include "GameConfig.h"
    #include "XXmlReader.h"
    #include "XEncryptAccess.h"
    #include "XCommon.h"
    
    CGameConfig* CGameConfig::g_pGameConfig = NULL;
    
    CGameConfig::CGameConfig()
    {
    
    }
    
    CGameConfig::~CGameConfig()
    {
    
    }
    
    CGameConfig* CGameConfig::getInstance()
    {
        if (!g_pGameConfig)
        {
            g_pGameConfig = new CGameConfig();
        }
        return g_pGameConfig;
    }
    
    void CGameConfig::destroy()
    {
        SAFE_DELETE(g_pGameConfig);
    }
    
    void CGameConfig::release()
    {
    
    }
    
    void CGameConfig::setResourcePath( const char* psPath )
    {
        m_strResourcePath = psPath;
    }
    
    string CGameConfig::getResourcePath()
    {
        return m_strResourcePath;
    }
    
    bool CGameConfig::loadBiontInfo()
    {
        string strFile = m_strResourcePath;
        strFile += "/config/biont.xml";
    
    
        //读取文档
        xmlDocPtr pDoc = NULL;
        LOAD_XML_DOC(strFile.c_str(), pDoc);
    
        if (NULL == pDoc)
        {
            CCLog("can not read %s", strFile.c_str());
            return false;
        }
    
        do
        {
            xmlNodePtr pRootNode = xmlDocGetRootElement(pDoc);
            if (NULL == pRootNode)
            {
                break;
            }
    
            if(0 != xmlStrcmp(BAD_CAST "bionts", pRootNode->name))
            {
                break;
            }
            //读取节点
            xmlNodePtr pCurNode = pRootNode->xmlChildrenNode;
            while (NULL != pCurNode)
            {
                if (0 != xmlStrcmp(pCurNode->name, BAD_CAST "biont"))
                {
                    pCurNode = pCurNode->next;
                    continue;
                }
    
                BiontInfo info;
                info.nType = CCXmlReader::getXMLNodeAttribInt(&pCurNode, "type");
                info.strFile = CCXmlReader::getXMLNodeAttribStrs(&pCurNode, "file");
                info.strAudio = CCXmlReader::getXMLNodeAttribStrs(&pCurNode, "audio");
                info.nBulk = CCXmlReader::getXMLNodeAttribInt(&pCurNode, "bulk");
                string strBuf = CCXmlReader::getXMLNodeAttribStrs(&pCurNode,"area");
                int nX, nY, nW, nH;
                sscanf(strBuf.c_str(),"%d %d %d %d",&nX, &nY, &nW, &nH);
                info.rArea = CCRect(nX,nY,nW,nH);
                info.strAction = CCXmlReader::getXMLNodeAttribStrs(&pCurNode, "action");
                info.nTag = CCXmlReader::getXMLNodeAttribInt(&pCurNode, "tag");
                info.strLap = CCXmlReader::getXMLNodeAttribStrs(&pCurNode, "lap");
                info.nDirect = CCXmlReader::getXMLNodeAttribInt(&pCurNode, "direct");
    
                m_vecBiontInfo.push_back(info);
    
                pCurNode = pCurNode->next;
            }
    
            xmlFreeDoc(pDoc);
            return true;
    
        } while (0);
    
        xmlFreeDoc(pDoc);
        CCLog("read xml error : %s", strFile.c_str());
        return false;
    }
    
    vector<BiontInfo>* CGameConfig::getBiontInfo()
    {
        return &m_vecBiontInfo;
    }
    
    BiontInfo* CGameConfig::getBiontInfoByType( int nType )
    {
        for (vector<BiontInfo>::iterator it = m_vecBiontInfo.begin(); it != m_vecBiontInfo.end(); it++)
        {
            if (nType == it->nType)
            {
                return &(*it);
            }
        }
        CCLog("error: CGameConfig::getBiontInfoByType");
        return NULL;
    }
    
    bool CGameConfig::loadMapInfo()
    {
        string strFile = m_strResourcePath;
        strFile += "/config/map.xml";
    
        //读取文档
        xmlDocPtr pDoc = NULL;
        LOAD_XML_DOC(strFile.c_str(), pDoc);
    
        if (NULL == pDoc)
        {
            CCLog("can not read %s", strFile.c_str());
            return false;
        }
    
        do
        {
            xmlNodePtr pRootNode = xmlDocGetRootElement(pDoc);
            if (NULL == pRootNode)
            {
                break;
            }
    
            if(0 != xmlStrcmp(BAD_CAST "maps", pRootNode->name))
            {
                break;
            }
            //读取节点
            xmlNodePtr pElement = pRootNode->xmlChildrenNode;
            while (NULL != pElement)
            {
                if (0 == xmlStrcmp(pElement->name, BAD_CAST "map"))
                {
                    MapInfo mapInfo;
                    mapInfo.nId = CCXmlReader::getXMLNodeAttribInt(&pElement, "id");
    
                    vector<string> vecData;
                    CXCommon::split(CCXmlReader::getXMLNodeAttribStrs(&pElement, "data"), string(";"), vecData);
                    for (unsigned int i = 0; i < vecData.size(); i++)
                    {
                        vector<string> vecPos;
                        CXCommon::split(vecData[i], string(","), vecPos);
                        if (!vecPos.empty())
                        {
                            mapInfo.foundationPos.push_back(CCPoint(atof(vecPos[0].c_str()), atof(vecPos[1].c_str())));
                        }
                    }
                    
                    vector<string> vecPath;
                    CXCommon::split(CCXmlReader::getXMLNodeAttribStrs(&pElement, "path"), string(";"), vecPath);
                    for (unsigned int i = 0; i < vecPath.size(); i++)
                    {
                        vector<string> vecPos;
                        CXCommon::split(vecPath[i], string(","), vecPos);
                        if (!vecPos.empty())
                        {
                            mapInfo.path.push_back(CCPoint(atof(vecPos[0].c_str()), atof(vecPos[1].c_str())));
                        }
                    }
    
                    m_mapMapInfo[mapInfo.nId] = mapInfo;
                }
                pElement = pElement->next;
            }
            xmlFreeDoc(pDoc);
            return true;
        } while (0);
    
        xmlFreeDoc(pDoc);
        CCLog("read xml error : %s", strFile.c_str());
        return false;
    }
    
    map<int, MapInfo>* CGameConfig::getMapInfo()
    {
        return &m_mapMapInfo;
    }
    
    MapInfo* CGameConfig::getMapInfoById( int nId )
    {
        for (map<int, MapInfo>::iterator it = m_mapMapInfo.begin(); it != m_mapMapInfo.end(); it++)
        {
            if (nId == it->first)
            {
                return &(it->second);
            }
        }
        CCLog("error: CGameConfig::getMapInfoById");
        return NULL;
    }
  • 相关阅读:
    P2572 [SCOI2010]序列操作
    python学习笔记2
    嗯,python
    ETROBOT——审题
    条件编译
    第三章单片机简介
    模拟输入输出
    arduino库函数1
    arduino相关文献阅读
    Arduino的小灯亮起来~~~
  • 原文地址:https://www.cnblogs.com/newlist/p/3180997.html
Copyright © 2020-2023  润新知