#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;
}