#ifndef __CONFIG_H__ #define __CONFIG_H__ #include "GameFrameHead.h" //图片信息 struct ImageInfo { int nId; //ID标识 string strKey; //key标识 string strFile; //文件路径 }; //资源信息 struct ResourceInfo { }; //ui //控件信息 struct CtrlInfo { int nId; CCPoint tPos; //坐标 CCPoint tAnchor; //锚点 CCRect rRect; string strPic; //图片 string strText; //文本内容 string strFont; //文本字体 string strAudioFile;//声音文件 unsigned int nFontSize; //文本字体大小 unsigned int wLabelType; //文本类型 string strItem; //rollView条款 unsigned short wRollType;//roll控件类型 float fBounds; //拖动速率 string strWord; // unsigned short wType;//控件类型 unsigned short wAlignment;//文本对齐方式 unsigned short btnState;//按钮状态 unsigned short btnType; //按钮类型 ccColor3B color3B; //文本颜色 unsigned short notType; //屏蔽消息框类型 int nPriority;//消息优先级 enum WTYPE { _IDC_IMG = 1, //图片 _IDC_STA = 2, //文本 _IDC_BTN = 3, //按钮 _IDC_SROLL = 4, //Sroll _IDC_NOT = 5, //屏蔽消息框 _IDC_ROLL= 6, //滚动框 }; enum BTN_TYPE { _BT_Normal = 0, //正常 _BT_Select = 1, //选择 }; enum LabelType { _LableTTF = 0, _LabelBMFont = 1, _LabelAtlas = 2, }; }; //部件配置 struct WidgetInfo { int nId; CCPoint tPos; //坐标 CCPoint tAnchor; //锚点 CCRect rRect; string strPic; //图片 vector<CtrlInfo> m_vecCtrlInfo; }; //场景配置 struct SceneInfo { int nId; int nPosX; int nPosY; unsigned short wType; //条款(item)类型 unsigned short order; //层次 string strFile; CCRect rRect; enum WTYPE { _ITEM_IMG = 1, //图片 _ITEM_DLG = 2, //对话框 _ITEM_EFT = 3, //效果 _ITEM_STA = 4, //文本 _ITEM_BTN = 5, //按钮 }; }; //元素配置 struct PlistInfo { string strPlist; string strImage; }; struct ElementInfo { int nItem; vector<PlistInfo> vecPlistInfo; }; //动画配置 struct AnimationInfo { int nId; //物体ID(动画相关的物体) int nBegan; //开始帧数 int nCount; //动画帧数 int nInterval;//帧之间的间隔 string strName; //动画名字 string plistpath; //plist路径 string texturePath;//静态贴图文件路径 string picPrefix; //资源目录--默认(或空)为物体的ID }; //文字配置 struct WordInfo { string strKey; string strLetter; //文字 }; //滚动项配置 //struct SrollInfo //{ // int nId; // int nPosX; // int nPosY; // CCRect rRect; // string strPic; // // CtrlInfo ctrlInfo; // // unsigned short wType;//类型 // // vector<SrollInfo> vecRollSub; //}; // //struct SrollViewInfo //{ // string strKey; // vector<SrollInfo> vecRollInfo; //}; //滚动项配置 struct SrollInfo { string strKey; vector<WidgetInfo> vecWidgetInfo; }; //效果配置 struct EffectInfo { string strKey; int nId; int nPosX; int nPosY; CCRect rRect; string strFile; unsigned int wType; vector<EffectInfo> vecEffectSub; enum WTYPE { _Particle = 1, _Action = 2, _Animation = 3, }; }; //动作配置 struct ActionInfo { string strKey; int nAction; string strDepict; //动作名字 string strParm; //参数 bool bReverse; //是否反动作 string strFile; //动作文件 enum ActionType { _Particle = 1, _Action = 2, _Animation = 3, }; ActionType eType; //动作类型 }; //音效配置 struct AudioInfo { string strKey; unsigned int wType; string strFile; }; class GAMEFRAME_API CConfig { public: CConfig(); ~CConfig(); static CConfig* getInstance(); static void destroy(); void release(); bool loadConfig(); //读取配置文件 bool loadResourceInfo();// bool loadImageInfo();//图片信息 bool loadAnimationInfo();//动画信息 bool loadSceneInfo();//场景信息 bool loadElementInfo();//元素 (plist)文件形式 bool loadWidgetInfo();// 控件信息 bool loadSrollInfo(); //滚动项信息 bool loadEffectInfo();//效果配置 bool loadAudioInfo();//声音配置 bool loadWordInfo();//文字配置 bool loadActionInfo();//动作配置 bool loadNumberInfo();//数字配置 bool readConfig(); //设置资源路径 一开始就要设定 void setResourcePath(const char* psPath); string getResourcePath(); vector<ImageInfo>* getImageInfo(); ImageInfo* getImageInfoById(int nId); ImageInfo* getImageInfoByKey(const char* psKey); vector<WidgetInfo>* getWidgetInfo(); WidgetInfo* getWidgetInfoById(int nId); vector<ElementInfo>* getElementInfo(); vector<PlistInfo>* getElementInfoByItem(int nId); map<int,vector<SceneInfo> >* getSceneInfo(); vector<AnimationInfo>* getAnimationInfo(); vector<EffectInfo>* getEffectInfo(); EffectInfo* getEffectInfoByKey(const char* psKey); vector<WidgetInfo>* getSrollInfoByKey(const char* psKey); AudioInfo* getAudioInfoByKey(const char* psKey); WordInfo& getWordInfoByKey(const char* psKey); string getWordBykey(const char* psKey); ActionInfo* getActionInfoByKey(const char* psKey); float getNumberByKey(const char* psKey); private: vector<string> m_vceConfigStr; //资源路径 string m_strResourcePath; static CConfig* g_pConfig; //图片资源配置标识 vector<ImageInfo> m_vecImageInfo; //场景配置标识 map<int, vector<SceneInfo> > m_mapSceneInfoVec; //元素(plist)配置标识 vector<ElementInfo> m_vecElement; //windget配置标识 vector<WidgetInfo> m_vecWidgetInfo; //动画配置标识 vector<AnimationInfo> m_vecAnimationInfo; //Sroll配置标识 vector<SrollInfo> m_vecSrollInfo; //效果配置 vector<EffectInfo> m_vecEffectInfo; //音效配置 vector<AudioInfo> m_vecAudioInfo; //文字配置 map<string, WordInfo> m_mapWordInfo; //动作配置 vector<ActionInfo> m_vecActionInfo; map<string, float> m_mapNumber; }; #endif //__XCONFIG_H__
#include "Config.h" #include "XXmlReader.h" CConfig* CConfig::g_pConfig = NULL; CConfig::CConfig() { m_strResourcePath.clear(); m_vecImageInfo.clear(); m_mapSceneInfoVec.clear(); m_vecElement.clear(); m_vecWidgetInfo.clear(); m_vecAnimationInfo.clear(); m_vecEffectInfo.clear(); } CConfig::~CConfig() { } CConfig* CConfig::getInstance() { if (!g_pConfig) { g_pConfig = new CConfig(); } return g_pConfig; } void CConfig::destroy() { g_pConfig->release(); SAFE_DELETE(g_pConfig); } void CConfig::release() { m_strResourcePath.clear(); m_vecImageInfo.clear(); m_mapSceneInfoVec.clear(); m_vecElement.clear(); m_vecWidgetInfo.clear(); m_vecAnimationInfo.clear(); } bool CConfig::loadConfig() { return false; } void CConfig::setResourcePath( const char* psPath ) { m_strResourcePath = psPath; } string CConfig::getResourcePath() { return m_strResourcePath; } bool CConfig::readConfig() { return true; } bool CConfig::loadImageInfo() { string strFile = m_strResourcePath; strFile += "/config/image.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 "images", pRootNode->name)) { break; } //读取节点 xmlNodePtr pCurNode = pRootNode->xmlChildrenNode; while (NULL != pCurNode) { if (0 != xmlStrcmp(pCurNode->name, BAD_CAST "image")) { pCurNode = pCurNode->next; continue; } ImageInfo info; info.nId = CCXmlReader::getXMLNodeAttribInt(&pCurNode, "id"); info.strKey = CCXmlReader::getXMLNodeAttribStrs(&pCurNode, "key"); info.strFile = CCXmlReader::getXMLNodeAttribStrs(&pCurNode, "file"); m_vecImageInfo.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<ImageInfo>* CConfig::getImageInfo() { return &m_vecImageInfo; } bool CConfig::loadSceneInfo() { string strFile = m_strResourcePath; strFile += "/config/scene.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 "scenes", pRootNode->name)) { break; } //读取节点 xmlNodePtr pElement = pRootNode->xmlChildrenNode; while (pElement) { if (0 != xmlStrcmp(pElement->name, BAD_CAST "scene")) { pElement = pElement->next; continue; } xmlNodePtr pItemNode = pElement->xmlChildrenNode; vector<SceneInfo> vecSceneInfo; while (pItemNode) { if (0 != xmlStrcmp(pItemNode->name, BAD_CAST "item")) { pItemNode = pItemNode->next; continue; } SceneInfo info; info.nId = CCXmlReader::getXMLNodeAttribInt(&pItemNode, "id"); info.wType = CCXmlReader::getXMLNodeAttribInt(&pItemNode, "type"); string strBuf = CCXmlReader::getXMLNodeAttribStrs(&pItemNode, "pos"); int nRectX = 0, nRectY = 0, nRectW = 0, nRectH = 0; sscanf(strBuf.c_str(),"%d %d %d %d %d %d",&info.nPosX,&info.nPosY,&nRectX,&nRectY,&nRectW,&nRectH); info.rRect.setRect(nRectX,nRectY,nRectW,nRectH); info.order = CCXmlReader::getXMLNodeAttribInt(&pItemNode, "order"); info.strFile = CCXmlReader::getXMLNodeAttribStrs(&pItemNode, "file"); vecSceneInfo.push_back(info); pItemNode = pItemNode->next; } int nKey = CCXmlReader::getXMLNodeAttribInt(&pElement, "id"); m_mapSceneInfoVec[nKey] = vecSceneInfo; pElement = pElement->next; } xmlFreeDoc(pDoc); return true; } while (0); xmlFreeDoc(pDoc); CCLog("read xml error : %s", strFile.c_str()); return false; } bool CConfig::loadElementInfo() { string strFile = m_strResourcePath; strFile += "/config/element.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 "elements", pRootNode->name)) { break; } //读取节点 xmlNodePtr pItemNode = pRootNode->xmlChildrenNode; while (NULL != pItemNode) { if (0 != xmlStrcmp(pItemNode->name, BAD_CAST "item")) { pItemNode = pItemNode->next; continue; } ElementInfo elemInfo; elemInfo.nItem = CCXmlReader::getXMLNodeAttribInt(&pItemNode, "id"); xmlNodePtr pElemNode = pItemNode->xmlChildrenNode; while(pElemNode) { if (0 != xmlStrcmp(pElemNode->name, BAD_CAST "element")) { pElemNode = pElemNode->next; continue; } PlistInfo info; info.strPlist = CCXmlReader::getXMLNodeAttribStrs(&pElemNode, "plist"); info.strImage = CCXmlReader::getXMLNodeAttribStrs(&pElemNode, "image"); elemInfo.vecPlistInfo.push_back(info); pElemNode = pElemNode->next; } m_vecElement.push_back(elemInfo); pItemNode = pItemNode->next; } xmlFreeDoc(pDoc); return true; } while (0); xmlFreeDoc(pDoc); CCLog("read xml error : %s", strFile.c_str()); return false; } bool CConfig::loadWidgetInfo() { string strFile = m_strResourcePath; strFile += "/config/widget.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 "widgets", pRootNode->name)) { break; } //读取节点 xmlNodePtr pElement = pRootNode->xmlChildrenNode; while (NULL != pElement) { if (0 != xmlStrcmp(pElement->name, BAD_CAST "widget")) { pElement = pElement->next; continue; } WidgetInfo widgetInfo; widgetInfo.nId = CCXmlReader::getXMLNodeAttribInt(&pElement, "id"); string strBuf = CCXmlReader::getXMLNodeAttribStrs(&pElement,"pos"); int nPosX = 0, nPosY = 0, nRectX = 0, nRectY = 0, nRectW = 0, nRectH = 0; sscanf(strBuf.c_str(),"%d %d %d %d %d %d",&nPosX,&nPosY,&nRectX,&nRectY,&nRectW,&nRectH); widgetInfo.tPos.setPoint(nPosX, nPosY); widgetInfo.rRect.setRect(nRectX, nRectY, nRectW, nRectH); strBuf = CCXmlReader::getXMLNodeAttribStrs(&pElement, "anchor"); float fAnchorX = 0, fAnchorY = 0; sscanf(strBuf.c_str(),"%f %f",&fAnchorX, &fAnchorY); widgetInfo.tAnchor.setPoint(fAnchorX, fAnchorY); widgetInfo.strPic = CCXmlReader::getXMLNodeAttribStrs(&pElement, "pic"); xmlNodePtr pCtrlNode = pElement->xmlChildrenNode; while (pCtrlNode) { //图片控件 if (0 == xmlStrcmp(pCtrlNode->name, BAD_CAST "img")) { CtrlInfo info; info.nId = CCXmlReader::getXMLNodeAttribInt(&pCtrlNode, "id"); string strBuf = CCXmlReader::getXMLNodeAttribStrs(&pCtrlNode,"pos"); int nPosX = 0, nPosY = 0, nRectX = 0, nRectY = 0, nRectW = 0, nRectH = 0; sscanf(strBuf.c_str(),"%d %d %d %d %d %d",&nPosX,&nPosY,&nRectX,&nRectY,&nRectW,&nRectH); info.tPos.setPoint(nPosX, nPosY); info.rRect.setRect(nRectX, nRectY, nRectW, nRectH); info.strPic = CCXmlReader::getXMLNodeAttribStrs(&pCtrlNode, "pic"); strBuf = CCXmlReader::getXMLNodeAttribStrs(&pCtrlNode, "anchor"); float fAnchorX = 0, fAnchorY = 0; sscanf(strBuf.c_str(),"%f %f",&fAnchorX, &fAnchorY); info.tAnchor.setPoint(fAnchorX, fAnchorY); info.wType = CtrlInfo::_IDC_IMG; widgetInfo.m_vecCtrlInfo.push_back(info); } //按钮控件 if (0 == xmlStrcmp(pCtrlNode->name, BAD_CAST "btn")) { CtrlInfo info; info.nId = CCXmlReader::getXMLNodeAttribInt(&pCtrlNode, "id"); string strBuf = CCXmlReader::getXMLNodeAttribStrs(&pCtrlNode,"pos"); int nPosX = 0, nPosY = 0, nRectX = 0, nRectY = 0, nRectW = 0, nRectH = 0; sscanf(strBuf.c_str(),"%d %d %d %d %d %d",&nPosX,&nPosY,&nRectX,&nRectY,&nRectW,&nRectH); info.tPos.setPoint(nPosX, nPosY); info.rRect.setRect(nRectX, nRectY, nRectW, nRectH); strBuf = CCXmlReader::getXMLNodeAttribStrs(&pCtrlNode, "anchor"); float fAnchorX = 0, fAnchorY = 0; sscanf(strBuf.c_str(),"%f %f",&fAnchorX, &fAnchorY); info.wType = CtrlInfo::_IDC_BTN; info.btnType = CCXmlReader::getXMLNodeAttribInt(&pCtrlNode, "type"); info.btnState = CCXmlReader::getXMLNodeAttribInt(&pCtrlNode, "state"); info.strPic = CCXmlReader::getXMLNodeAttribStrs(&pCtrlNode, "pic"); info.strAudioFile = CCXmlReader::getXMLNodeAttribStrs(&pCtrlNode, "audio"); widgetInfo.m_vecCtrlInfo.push_back(info); } //文本控件 if (0 == xmlStrcmp(pCtrlNode->name, BAD_CAST "sta")) { CtrlInfo info; info.nId = CCXmlReader::getXMLNodeAttribInt(&pCtrlNode, "id"); string strBuf = CCXmlReader::getXMLNodeAttribStrs(&pCtrlNode,"pos"); int nPosX = 0, nPosY = 0, nRectX = 0, nRectY = 0, nRectW = 0, nRectH = 0; sscanf(strBuf.c_str(),"%d %d %d %d %d %d",&nPosX,&nPosY,&nRectX,&nRectY,&nRectW,&nRectH); info.tPos.setPoint(nPosX, nPosY); info.rRect.setRect(nRectX, nRectY, nRectW, nRectH); strBuf = CCXmlReader::getXMLNodeAttribStrs(&pCtrlNode, "anchor"); float fAnchorX = 0, fAnchorY = 0; sscanf(strBuf.c_str(),"%f %f",&fAnchorX, &fAnchorY); info.tAnchor.setPoint(fAnchorX, fAnchorY); info.wType = CtrlInfo::_IDC_STA; info.wLabelType = CCXmlReader::getXMLNodeAttribInt(&pCtrlNode, "type"); info.strText = CCXmlReader::getXMLNodeAttribStrs(&pCtrlNode, "text"); info.nFontSize = CCXmlReader::getXMLNodeAttribInt(&pCtrlNode, "fontsize"); info.strFont = CCXmlReader::getXMLNodeAttribStrs(&pCtrlNode, "font"); info.wAlignment = CCXmlReader::getXMLNodeAttribInt(&pCtrlNode, "aligning"); strBuf = CCXmlReader::getXMLNodeAttribStrs(&pCtrlNode, "color"); int nR = 0, nG = 0, nB = 0; sscanf(strBuf.c_str(), "%d %d %d",&nR, &nG, &nB); info.color3B.r = (char)nR; info.color3B.g = (char)nG; info.color3B.b = (char)nB; widgetInfo.m_vecCtrlInfo.push_back(info); } //Sroll控件 if (0 == xmlStrcmp(pCtrlNode->name, BAD_CAST "srl")) { CtrlInfo info; info.nId = CCXmlReader::getXMLNodeAttribInt(&pCtrlNode, "id"); string strBuf = CCXmlReader::getXMLNodeAttribStrs(&pCtrlNode,"pos"); int nPosX = 0, nPosY = 0, nRectX = 0, nRectY = 0, nRectW = 0, nRectH = 0; sscanf(strBuf.c_str(),"%d %d %d %d %d %d",&nPosX,&nPosY,&nRectX,&nRectY,&nRectW,&nRectH); info.tPos.setPoint(nPosX, nPosY); info.rRect.setRect(nRectX, nRectY, nRectW, nRectH); strBuf = CCXmlReader::getXMLNodeAttribStrs(&pCtrlNode, "anchor"); float fAnchorX = 0, fAnchorY = 0; sscanf(strBuf.c_str(),"%f %f",&fAnchorX, &fAnchorY); info.tAnchor.setPoint(fAnchorX, fAnchorY); info.strItem = CCXmlReader::getXMLNodeAttribStrs(&pCtrlNode, "item"); info.wRollType = CCXmlReader::getXMLNodeAttribInt(&pCtrlNode, "type"); info.fBounds = CCXmlReader::getXMLNodeAttribfloat(&pCtrlNode, "bounds"); info.wType = CtrlInfo::_IDC_SROLL; widgetInfo.m_vecCtrlInfo.push_back(info); } //禁用触摸控件 if (0 == xmlStrcmp(pCtrlNode->name, BAD_CAST "not")) { CtrlInfo info; info.nId = CCXmlReader::getXMLNodeAttribInt(&pCtrlNode, "id"); info.notType = CCXmlReader::getXMLNodeAttribInt(&pCtrlNode, "type"); string strBuf = CCXmlReader::getXMLNodeAttribStrs(&pCtrlNode,"pos"); int nPosX = 0, nPosY = 0, nRectX = 0, nRectY = 0, nRectW = 0, nRectH = 0; sscanf(strBuf.c_str(),"%d %d %d %d %d %d",&nPosX,&nPosY,&nRectX,&nRectY,&nRectW,&nRectH); info.tPos.setPoint(nPosX, nPosY); info.rRect.setRect(nRectX, nRectY, nRectW, nRectH); strBuf = CCXmlReader::getXMLNodeAttribStrs(&pCtrlNode, "anchor"); float fAnchorX = 0, fAnchorY = 0; sscanf(strBuf.c_str(),"%f %f",&fAnchorX, &fAnchorY); info.tAnchor.setPoint(fAnchorX, fAnchorY); info.nPriority = CCXmlReader::getXMLNodeAttribInt(&pCtrlNode, "priority"); info.wType = CtrlInfo::_IDC_NOT; widgetInfo.m_vecCtrlInfo.push_back(info); } pCtrlNode = pCtrlNode->next; } m_vecWidgetInfo.push_back(widgetInfo); pElement = pElement->next; } xmlFreeDoc(pDoc); return true; } while (0); xmlFreeDoc(pDoc); CCLog("read xml error : %s", strFile.c_str()); return false; } vector<WidgetInfo>* CConfig::getWidgetInfo() { return& m_vecWidgetInfo; } vector<ElementInfo>* CConfig::getElementInfo() { return& m_vecElement; } map<int,vector<SceneInfo> >* CConfig::getSceneInfo() { return& m_mapSceneInfoVec; } bool CConfig::loadAnimationInfo() { string strFile = m_strResourcePath; strFile += "/config/animation.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 "animations", pRootNode->name)) { break; } //读取节点 xmlNodePtr pCurNode = pRootNode->xmlChildrenNode; while (NULL != pCurNode) { if (0 != xmlStrcmp(pCurNode->name, BAD_CAST "animation")) { pCurNode = pCurNode->next; continue; } AnimationInfo info; info.nId = CCXmlReader::getXMLNodeAttribInt(&pCurNode, "id"); info.nBegan = CCXmlReader::getXMLNodeAttribInt(&pCurNode, "began"); info.nCount = CCXmlReader::getXMLNodeAttribInt(&pCurNode, "count"); info.nInterval = CCXmlReader::getXMLNodeAttribInt(&pCurNode, "interval"); info.strName = CCXmlReader::getXMLNodeAttribStrs(&pCurNode, "name"); m_vecAnimationInfo.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<AnimationInfo>* CConfig::getAnimationInfo() { return &m_vecAnimationInfo; } ImageInfo* CConfig::getImageInfoById( int nId ) { for (vector<ImageInfo>::iterator it = m_vecImageInfo.begin(); it != m_vecImageInfo.end(); it++) { if (it->nId == nId) { return &(*it); } } CCLog("error: CConfig::getPlanInfoById"); return NULL; } WidgetInfo* CConfig::getWidgetInfoById( int nId ) { for (vector<WidgetInfo>::iterator it = m_vecWidgetInfo.begin(); it != m_vecWidgetInfo.end(); it++) { if (it->nId == nId) { return &(*it); } } CCLog("error: CConfig::getWidgetInfoById"); return NULL; } bool CConfig::loadSrollInfo() { string strFile = m_strResourcePath; strFile += "/config/sroll.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 "srolls", pRootNode->name)) { break; } //读取节点 xmlNodePtr pElement = pRootNode->xmlChildrenNode; while (NULL != pElement) { if (0 == xmlStrcmp(pElement->name, BAD_CAST "item")) { SrollInfo srollInfo; srollInfo.strKey = CCXmlReader::getXMLNodeAttribStrs(&pElement, "key"); xmlNodePtr pWidgetNode = pElement->xmlChildrenNode; while(pWidgetNode) { if (0 == xmlStrcmp(pWidgetNode->name, BAD_CAST "widget")) { WidgetInfo widgetInfo; widgetInfo.nId = CCXmlReader::getXMLNodeAttribInt(&pWidgetNode, "id"); string strBuf = CCXmlReader::getXMLNodeAttribStrs(&pWidgetNode,"pos"); int nPosX = 0, nPosY = 0, nRectX = 0, nRectY = 0, nRectW = 0, nRectH = 0; sscanf(strBuf.c_str(),"%d %d %d %d %d %d",&nPosX,&nPosY,&nRectX,&nRectY,&nRectW,&nRectH); widgetInfo.tPos.setPoint(nPosX, nPosY); widgetInfo.rRect.setRect(nRectX, nRectY, nRectW, nRectH); widgetInfo.strPic = CCXmlReader::getXMLNodeAttribStrs(&pWidgetNode, "pic"); xmlNodePtr pCtrlNode = pWidgetNode->xmlChildrenNode; while(pCtrlNode) { if (0 == xmlStrcmp(pCtrlNode->name, BAD_CAST "btn")) { CtrlInfo info; info.nId = CCXmlReader::getXMLNodeAttribInt(&pCtrlNode, "id"); string strBuf = CCXmlReader::getXMLNodeAttribStrs(&pCtrlNode,"pos"); int nPosX = 0, nPosY = 0, nRectX = 0, nRectY = 0, nRectW = 0, nRectH = 0; sscanf(strBuf.c_str(),"%d %d %d %d %d %d",&nPosX,&nPosY,&nRectX,&nRectY,&nRectW,&nRectH); info.tPos.setPoint(nPosX, nPosY); info.rRect.setRect(nRectX, nRectY, nRectW, nRectH); strBuf = CCXmlReader::getXMLNodeAttribStrs(&pCtrlNode, "anchor"); float fAnchorX = 0, fAnchorY = 0; sscanf(strBuf.c_str(),"%f %f",&fAnchorX, &fAnchorY); info.wType = CtrlInfo::_IDC_BTN; info.btnType = CCXmlReader::getXMLNodeAttribInt(&pCtrlNode, "type"); info.btnState = CCXmlReader::getXMLNodeAttribInt(&pCtrlNode, "state"); info.strPic = CCXmlReader::getXMLNodeAttribStrs(&pCtrlNode, "pic"); info.strAudioFile = CCXmlReader::getXMLNodeAttribStrs(&pCtrlNode, "audio"); widgetInfo.m_vecCtrlInfo.push_back(info); } //图片控件 if (0 == xmlStrcmp(pCtrlNode->name, BAD_CAST "img")) { CtrlInfo info; info.nId = CCXmlReader::getXMLNodeAttribInt(&pCtrlNode, "id"); string strBuf = CCXmlReader::getXMLNodeAttribStrs(&pCtrlNode,"pos"); int nPosX = 0, nPosY = 0, nRectX = 0, nRectY = 0, nRectW = 0, nRectH = 0; sscanf(strBuf.c_str(),"%d %d %d %d %d %d",&nPosX,&nPosY,&nRectX,&nRectY,&nRectW,&nRectH); info.tPos.setPoint(nPosX, nPosY); info.rRect.setRect(nRectX, nRectY, nRectW, nRectH); info.strPic = CCXmlReader::getXMLNodeAttribStrs(&pCtrlNode, "pic"); strBuf = CCXmlReader::getXMLNodeAttribStrs(&pCtrlNode, "anchor"); float fAnchorX = 0, fAnchorY = 0; sscanf(strBuf.c_str(),"%f %f",&fAnchorX, &fAnchorY); info.tAnchor.setPoint(fAnchorX, fAnchorY); info.wType = CtrlInfo::_IDC_IMG; widgetInfo.m_vecCtrlInfo.push_back(info); } //文本控件 if (0 == xmlStrcmp(pCtrlNode->name, BAD_CAST "sta")) { CtrlInfo info; info.nId = CCXmlReader::getXMLNodeAttribInt(&pCtrlNode, "id"); string strBuf = CCXmlReader::getXMLNodeAttribStrs(&pCtrlNode,"pos"); int nPosX = 0, nPosY = 0, nRectX = 0, nRectY = 0, nRectW = 0, nRectH = 0; sscanf(strBuf.c_str(),"%d %d %d %d %d %d",&nPosX,&nPosY,&nRectX,&nRectY,&nRectW,&nRectH); info.tPos.setPoint(nPosX, nPosY); info.rRect.setRect(nRectX, nRectY, nRectW, nRectH); strBuf = CCXmlReader::getXMLNodeAttribStrs(&pCtrlNode, "anchor"); float fAnchorX = 0, fAnchorY = 0; sscanf(strBuf.c_str(),"%f %f",&fAnchorX, &fAnchorY); info.tAnchor.setPoint(fAnchorX, fAnchorY); info.wType = CtrlInfo::_IDC_STA; info.wLabelType = CCXmlReader::getXMLNodeAttribInt(&pCtrlNode, "type"); info.strText = CCXmlReader::getXMLNodeAttribStrs(&pCtrlNode, "text"); info.nFontSize = CCXmlReader::getXMLNodeAttribInt(&pCtrlNode, "fontsize"); info.strFont = CCXmlReader::getXMLNodeAttribStrs(&pCtrlNode, "font"); info.wAlignment = CCXmlReader::getXMLNodeAttribInt(&pCtrlNode, "aligning"); strBuf = CCXmlReader::getXMLNodeAttribStrs(&pCtrlNode, "color"); int nR = 0, nG = 0, nB = 0; sscanf(strBuf.c_str(), "%d %d %d",&nR, &nG, &nB); info.color3B.r = (char)nR; info.color3B.g = (char)nG; info.color3B.b = (char)nB; widgetInfo.m_vecCtrlInfo.push_back(info); } //禁用触摸控件 if (0 == xmlStrcmp(pCtrlNode->name, BAD_CAST "not")) { CtrlInfo info; info.nId = CCXmlReader::getXMLNodeAttribInt(&pCtrlNode, "id"); string strBuf = CCXmlReader::getXMLNodeAttribStrs(&pCtrlNode,"pos"); int nPosX = 0, nPosY = 0, nRectX = 0, nRectY = 0, nRectW = 0, nRectH = 0; sscanf(strBuf.c_str(),"%d %d %d %d %d %d",&nPosX,&nPosY,&nRectX,&nRectY,&nRectW,&nRectH); info.tPos.setPoint(nPosX, nPosY); info.rRect.setRect(nRectX, nRectY, nRectW, nRectH); strBuf = CCXmlReader::getXMLNodeAttribStrs(&pCtrlNode, "anchor"); float fAnchorX = 0, fAnchorY = 0; sscanf(strBuf.c_str(),"%f %f",&fAnchorX, &fAnchorY); info.tAnchor.setPoint(fAnchorX, fAnchorY); info.nPriority = CCXmlReader::getXMLNodeAttribInt(&pCtrlNode, "priority"); info.wType = CtrlInfo::_IDC_NOT; widgetInfo.m_vecCtrlInfo.push_back(info); } pCtrlNode = pCtrlNode->next; } srollInfo.vecWidgetInfo.push_back(widgetInfo); } pWidgetNode = pWidgetNode->next; } m_vecSrollInfo.push_back(srollInfo); } pElement = pElement->next; } xmlFreeDoc(pDoc); return true; }while(0); xmlFreeDoc(pDoc); CCLog("read xml error : %s", strFile.c_str()); return false; } bool CConfig::loadEffectInfo() { string strFile = m_strResourcePath; strFile += "/config/effect.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 "effects", pRootNode->name)) { break; } //读取节点 xmlNodePtr pElement = pRootNode->xmlChildrenNode; while (NULL != pElement) { if (0 != xmlStrcmp(pElement->name, BAD_CAST "effect")) { pElement = pElement->next; continue; } EffectInfo effectInfo; effectInfo.strKey = CCXmlReader::getXMLNodeAttribStrs(&pElement, "key"); string strEffectPosBuf = CCXmlReader::getXMLNodeAttribStrs(&pElement, "pos"); int nRectX = 0, nRectY = 0, nRectW = 0, nRectH = 0; sscanf(strEffectPosBuf.c_str(), "%d %d %d %d %d %d", &effectInfo.nPosX, &effectInfo.nPosY, &nRectX, &nRectY, &nRectW, &nRectH); effectInfo.rRect.setRect(nRectX, nRectY, nRectW, nRectH); xmlNodePtr pCurNode = pElement->xmlChildrenNode; while (pCurNode) { if (0 == xmlStrcmp(pCurNode->name, BAD_CAST "particle")) { EffectInfo info; info.nId = CCXmlReader::getXMLNodeAttribInt(&pCurNode, "id"); string strBuf = CCXmlReader::getXMLNodeAttribStrs(&pCurNode, "pos"); int nRectX = 0, nRectY = 0, nRectW = 0, nRectH = 0; sscanf(strBuf.c_str(), "%d %d %d %d %d %d", &info.nPosX, &info.nPosY, &nRectX, &nRectY, &nRectW, &nRectH); info.rRect.setRect(nRectX, nRectY, nRectW, nRectH); info.wType = CCXmlReader::getXMLNodeAttribInt(&pCurNode, "type"); info.strFile = CCXmlReader::getXMLNodeAttribStrs(&pCurNode, "file"); effectInfo.vecEffectSub.push_back(info); } if (0 == xmlStrcmp(pCurNode->name, BAD_CAST "action")) { } if (0 == xmlStrcmp(pCurNode->name, BAD_CAST "Animate")) { EffectInfo info; info.nId = CCXmlReader::getXMLNodeAttribInt(&pCurNode, "id"); string strBuf = CCXmlReader::getXMLNodeAttribStrs(&pCurNode, "pos"); int nRectX = 0, nRectY = 0, nRectW = 0, nRectH = 0; sscanf(strBuf.c_str(), "%d %d %d %d %d %d", &info.nPosX, &info.nPosY, &nRectX, &nRectY, &nRectW, &nRectH); info.rRect.setRect(nRectX, nRectY, nRectW, nRectH); info.wType = CCXmlReader::getXMLNodeAttribInt(&pCurNode, "type"); info.strFile = CCXmlReader::getXMLNodeAttribStrs(&pCurNode, "file"); effectInfo.vecEffectSub.push_back(info); } pCurNode = pCurNode->next; } m_vecEffectInfo.push_back(effectInfo); pElement = pElement->next; } xmlFreeDoc(pDoc); return true; } while (0); xmlFreeDoc(pDoc); CCLog("read xml error : %s", strFile.c_str()); return false; } EffectInfo* CConfig::getEffectInfoByKey(const char* psKey) { for (vector<EffectInfo>::iterator it = m_vecEffectInfo.begin(); it != m_vecEffectInfo.end(); it++) { if (0 == strcmp(it->strKey.c_str(), psKey)) { return &(*it); } } CCLog("error: CConfig::getEffectInfoByKey"); return NULL; } vector<EffectInfo>* CConfig::getEffectInfo() { return &m_vecEffectInfo; } vector<WidgetInfo>* CConfig::getSrollInfoByKey( const char* psKey ) { for (vector<SrollInfo>::iterator it = m_vecSrollInfo.begin(); it != m_vecSrollInfo.end(); it++) { if (it->strKey == psKey) { return & it->vecWidgetInfo; } } CCLog("error: CConfig::getSrollInfoByKey"); return NULL; } bool CConfig::loadAudioInfo() { string strFile = m_strResourcePath; strFile += "/config/audio.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 "audios", pRootNode->name)) { break; } //读取节点 xmlNodePtr pCurNode = pRootNode->xmlChildrenNode; while (NULL != pCurNode) { if (0 != xmlStrcmp(pCurNode->name, BAD_CAST "audio")) { pCurNode = pCurNode->next; continue; } AudioInfo info; info.strKey = CCXmlReader::getXMLNodeAttribStrs(&pCurNode, "key"); info.wType = CCXmlReader::getXMLNodeAttribInt(&pCurNode, "type"); info.strFile = CCXmlReader::getXMLNodeAttribStrs(&pCurNode, "file"); m_vecAudioInfo.push_back(info); pCurNode = pCurNode->next; } xmlFreeDoc(pDoc); return true; } while (0); xmlFreeDoc(pDoc); CCLog("read xml error : %s", strFile.c_str()); return false; } AudioInfo* CConfig::getAudioInfoByKey( const char* psKey ) { for (vector<AudioInfo>::iterator it = m_vecAudioInfo.begin(); it != m_vecAudioInfo.end(); it++) { if (0 == strcmp(it->strKey.c_str(), psKey)) { return &(*it); } } CCLog("error: CConfig::getAudioInfoByKey"); return NULL; } vector<PlistInfo>* CConfig::getElementInfoByItem( int nId ) { for (vector<ElementInfo>::iterator it = m_vecElement.begin(); it != m_vecElement.end(); it++) { if (it->nItem == nId) { return &it->vecPlistInfo; } } CCLog("error: CConfig::getElementInfoById"); return NULL; } ImageInfo* CConfig::getImageInfoByKey( const char* psKey ) { for (vector<ImageInfo>::iterator it = m_vecImageInfo.begin(); it != m_vecImageInfo.end(); it++) { if ( it->strKey == psKey) { return &(*it); } } CCLog("error: CConfig::getImageInfoByKey"); return NULL; } bool CConfig::loadWordInfo() { string strFile = m_strResourcePath; strFile += "/config/word.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 "words", pRootNode->name)) { break; } //读取节点 xmlNodePtr pCurNode = pRootNode->xmlChildrenNode; while (NULL != pCurNode) { if (0 != xmlStrcmp(pCurNode->name, BAD_CAST "word")) { pCurNode = pCurNode->next; continue; } WordInfo info; info.strKey = CCXmlReader::getXMLNodeAttribStrs(&pCurNode, "key"); info.strLetter = CCXmlReader::getXMLNodeAttribStrs(&pCurNode, "letter"); m_mapWordInfo[info.strKey] = info; pCurNode = pCurNode->next; } xmlFreeDoc(pDoc); return true; } while (0); xmlFreeDoc(pDoc); CCLog("read xml error : %s", strFile.c_str()); return false; } WordInfo& CConfig::getWordInfoByKey( const char* psKey ) { return m_mapWordInfo[psKey]; } string CConfig::getWordBykey( const char* psKey ) { for (map<string, WordInfo>::iterator it = m_mapWordInfo.begin(); it != m_mapWordInfo.end(); it++) { if (it->first == psKey) { return it->second.strLetter; } } CCLog("warning: CConfig::getWordByKey"); return ""; } bool CConfig::loadActionInfo() { string strFile = m_strResourcePath; strFile += "/config/action.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 "actions", pRootNode->name)) { break; } //读取节点 xmlNodePtr pCurNode = pRootNode->xmlChildrenNode; while (NULL != pCurNode) { if (0 == xmlStrcmp(pCurNode->name, BAD_CAST "action")) { ActionInfo info; info.strKey = CCXmlReader::getXMLNodeAttribStrs(&pCurNode, "key"); info.nAction = CCXmlReader::getXMLNodeAttribInt(&pCurNode, "type"); info.strParm = CCXmlReader::getXMLNodeAttribStrs(&pCurNode, "parm"); info.eType = ActionInfo::_Action; m_vecActionInfo.push_back(info); } if (0 == xmlStrcmp(pCurNode->name, BAD_CAST "particle")) { ActionInfo info; info.strKey = CCXmlReader::getXMLNodeAttribStrs(&pCurNode, "key"); info.strFile = CCXmlReader::getXMLNodeAttribStrs(&pCurNode, "file"); info.eType = ActionInfo::_Particle; m_vecActionInfo.push_back(info); } pCurNode = pCurNode->next; } xmlFreeDoc(pDoc); return true; } while (0); xmlFreeDoc(pDoc); CCLog("read xml error : %s", strFile.c_str()); return false; } ActionInfo* CConfig::getActionInfoByKey( const char* psKey ) { for (vector<ActionInfo>::iterator it = m_vecActionInfo.begin(); it != m_vecActionInfo.end(); it++) { if (it->strKey == psKey) { return &(*it); } } CCLog("error: CConfig::getActionInfoByKey"); return NULL; } bool CConfig::loadNumberInfo() { string strFile = m_strResourcePath; strFile += "/config/number.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 "numbers", pRootNode->name)) { break; } //读取节点 xmlNodePtr pCurNode = pRootNode->xmlChildrenNode; while (NULL != pCurNode) { if (0 == xmlStrcmp(pCurNode->name, BAD_CAST "number")) { m_mapNumber[CCXmlReader::getXMLNodeAttribStrs(&pCurNode, "key")] = CCXmlReader::getXMLNodeAttribfloat(&pCurNode, "num"); } pCurNode = pCurNode->next; } xmlFreeDoc(pDoc); return true; } while (0); xmlFreeDoc(pDoc); CCLog("read xml error : %s", strFile.c_str()); return false; } float CConfig::getNumberByKey( const char* psKey ) { return m_mapNumber[psKey]; }