c++使用rapidxml读取cocos2dx的配置文件
来源:互联网 发布:入门单反推荐2017知乎 编辑:程序博客网 时间:2024/04/27 02:56
个人见解我们进行cocos2dx开发时可以像进行Android开发的那样专门建立一些配置文件例如Android中value下的string,color,dimen等资源更好的利用mvc的设计模式,可以实现配置与程序相分离!建立的配置文件如下
<?xml version="1.0" encoding="UTF-8" ?><resources> <!-- Default screen margins, per the Android Design guidelines. --> <dimen name="activity_horizontal_margin">16dp</dimen> <dimen name="activity_vertical_margin">16dp</dimen> <!-- string --> <string name="app_name">AndroidBitmap</string> <string name="hello_world">Hello world!</string> <string name="action_settings">Settings</string> <!-- color --> <color name="comm_head_back">#f7514b</color> <color name="comm_title_text">#FFFFFF</color> <color name="bottom_hong">#f85d58</color> <color name="bottom_qian">#929292</color> <color name="black">#000000</color> <color name="comm_back_ground">#B2B2B2</color> <color name="comm_back_shaixuan">#F4F4F4</color> <color name="comm_line_color">#B2B2B2</color> <color name="com_title_1">#b1b1b1</color> <color name="com_title_2">#007aff</color> <!-- position --> <position name="position1">12,23</position> <position name="position2">12,23</position> <!-- colorint --> <colorint name="ccc31">123,343,344</colorint> <!-- colordouble --> <colordouble name="ccc33">0.2,0.5,0.7</colordouble></resources>
创建读取配置文件的工具类,使用了rapidxml进行解析的
头文件
#ifndef _GLOBALPARAMETER_H_#define _GLOBALPARAMETER_H_#include "rapidxml.hpp"//#include "rapidxml_iterators.hpp"#include "rapidxml_print.hpp"#include "rapidxml_utils.hpp"#include <map> using namespace std;using namespace rapidxml;template <typename T>class PointXML{public: PointXML(){} PointXML(const T x, const T y) { this->x = x; this->y = y; } T x; T y;};template <typename T>class PointColorXML{public: PointColorXML(){} PointColorXML(const T r, const T g, const T b) { this->r = r; this->g = g; this->b = b; } T r; T g; T b;};class GlobalParameter{private : GlobalParameter(); static GlobalParameter* m_GlobalParameter; //load void load(); //color map<string, string> m_mapColor; //dimen map<string, string> m_mapDimen; //string map<string, string> m_mapString; //position map<string, PointXML<double>> m_mapPosition; //colorint map<string, PointColorXML<int>> m_mapColorint; //colordouble map<string, PointColorXML<double>> m_mapColordouble; //分割字符串 std::vector<std::string> split(std::string str, std::string pattern);public: static GlobalParameter* getInstance(); //------ string getColor(string name); string getDimen(string name); string getString(string name); PointXML<double> getPosition(string name); PointColorXML<int> getColorint(string name); PointColorXML<double> getColordouble(string name);};#endif
源文件
#include "GlobalParameter.h"#include <stdlib.h>GlobalParameter* GlobalParameter::m_GlobalParameter = NULL;GlobalParameter::GlobalParameter(){ //加载数据 load();}GlobalParameter* GlobalParameter::getInstance(){ if (m_GlobalParameter == NULL) //判断是否第一次调用 { m_GlobalParameter = new GlobalParameter(); } return m_GlobalParameter;}string GlobalParameter::getColor(string name){ map<string, string >::iterator iteratorl= m_mapColor.find(name); if (iteratorl == m_mapColor.end()) return ""; else return m_mapColor.find(name)->second;}string GlobalParameter::getDimen(string name){ map<string, string >::iterator iteratorl = m_mapDimen.find(name); if (iteratorl == m_mapDimen.end()) return ""; else return m_mapDimen.find(name)->second;}string GlobalParameter::getString(string name){ map<string, string >::iterator iteratorl = m_mapString.find(name); if (iteratorl == m_mapString.end()) return ""; else return m_mapString.find(name)->second;}PointXML<double> GlobalParameter::getPosition(string name){ map<string, PointXML<double> >::iterator iteratorl = m_mapPosition.find(name); if (iteratorl == m_mapPosition.end()) return PointXML<double>(0, 0); else return m_mapPosition.find(name)->second;}PointColorXML<int> GlobalParameter::getColorint(string name){ map<string, PointColorXML<int> >::iterator iteratorl = m_mapColorint.find(name); if (iteratorl == m_mapColorint.end()) return PointColorXML<int>(0, 0,0); else return m_mapColorint.find(name)->second;}PointColorXML<double> GlobalParameter::getColordouble(string name){ map<string, PointColorXML<double> >::iterator iteratorl = m_mapColordouble.find(name); if (iteratorl == m_mapColordouble.end()) return PointColorXML<double>(0, 0, 0); else return m_mapColordouble.find(name)->second;}void GlobalParameter::load(){ file<> fdoc("E://demo.xml"); xml_document<> doc; // character type defaults to char try { doc.parse<0>(fdoc.data()); //会改变参数的内容,tmpbuf的生命周期必须到解析完 } catch (rapidxml::parse_error &e) { return; } xml_node<>* root = doc.first_node(); xml_node<>* message = root->first_node(); for (; message; message = message->next_sibling()) { if (message->value_size() != NULL) { string s = message->name(); if ( s == "dimen") { xml_attribute<>* att = message->first_attribute("name"); m_mapDimen.insert(pair<string, string>(att->value(), message->value())); } else if (s == "string") { xml_attribute<>* att = message->first_attribute("name"); m_mapString.insert(pair<string, string>(att->value(), message->value())); } else if (s == "color") { xml_attribute<>* att = message->first_attribute("name"); m_mapColor.insert(pair<string, string>(att->value(), message->value())); } else if (s == "position") { xml_attribute<>* att = message->first_attribute("name"); string value = message->value(); std::vector<std::string> ve = split(value, ","); PointXML<double> p; if (ve.size() < 2) { if (ve.size() == 1) { p.x = atof(ve[0].data()); p.y = 0; } else { p.x = 0; p.y = 0; } } else { p.x = atof(ve[0].data()); p.y = atof(ve[1].data()); } m_mapPosition.insert(pair<string, PointXML<double>>(att->value(), p)); } else if (s == "colorint") { xml_attribute<>* att = message->first_attribute("name"); string value = message->value(); std::vector<std::string> ve = split(value, ","); PointColorXML<int> p; if (ve.size() < 3) { p.r = 0; p.g = 0; p.b = 0; } else { p.r = atoi(ve[0].data()); p.g = atoi(ve[1].data()); p.b = atoi(ve[2].data()); } m_mapColorint.insert(pair<string, PointColorXML<int>>(att->value(), p)); } else if (s == "colordouble") { xml_attribute<>* att = message->first_attribute("name"); string value = message->value(); std::vector<std::string> ve = split(value, ","); PointColorXML<double> p; if (ve.size() < 3) { p.r = 0; p.g = 0; p.b = 0; } else { p.r = atof(ve[0].data()); p.g = atof(ve[1].data()); p.b = atof(ve[2].data()); } m_mapColordouble.insert(pair<string, PointColorXML<double>>(att->value(), p)); } } }} //字符串分割函数std::vector<std::string> GlobalParameter::split(std::string str, std::string pattern){ std::string::size_type pos; std::vector<std::string> result; str += pattern;//扩展字符串以方便操作 int size=str.size(); for(int i=0; i<size; i++) { pos = str.find(pattern, i); if(pos<size) { std::string s = str.substr(i, pos - i); result.push_back(s); i = pos + pattern.size() - 1; } } return result;}
测试案例
GlobalParameter* m_Globalparameter = GlobalParameter::getInstance(); cout << m_Globalparameter->getColor("comm_head_back") << endl; cout << m_Globalparameter->getString("app_name") << endl; cout << m_Globalparameter->getDimen("activity_horizontal_margin") << endl; PointXML<double> p = m_Globalparameter->getPosition("position1"); cout << p.x << "----" << p.y << endl; PointColorXML<int> pi = m_Globalparameter->getColorint("ccc31"); cout << pi.r << "----" << pi.g << "---------" << pi.b << endl; PointColorXML<double> pd = m_Globalparameter->getColordouble("ccc33"); cout << pd.r << "----" << pd.g << "---------" << pd.b << endl;
OK!这样修改配置信息时就不用再去修改程序了!
0 0
- c++使用rapidxml读取cocos2dx的配置文件
- cocos2dx C++使用rapidxml读取XML配置文件
- 使用rapidxml读取配置文件
- 使用 rapidxml 做配置文件
- 使用 rapidxml 做配置文件
- Cocos2dx---------------- TinyXml 解析 XML(推荐使用rapidxml)
- Cocos2dx---------------- TinyXml 解析 XML(推荐使用rapidxml)
- Cocos2dx---------------- TinyXml 解析 XML(推荐使用rapidxml)
- Cocos2dx-TinyXml 解析 XML(推荐使用rapidxml)
- Cocos2dx---------------- TinyXml 解析 XML(推荐使用rapidxml)
- RapidXML的使用
- RAPIDxml的使用
- C++ rapidxml的使用
- 配置文件读取的使用
- rapidxml使用
- rapidxml使用
- cocos2dx下应用RapidXml作ConfigService遇到的问题
- cocos2dx XML配置文件读取详解
- “词”向量应用的一些思考
- 浅谈HTTP中Get与Post的区别
- Cocosd2d-js 使用Cocos Studio生成的Json界面文件
- Activity的四种launchMode
- 发短信
- c++使用rapidxml读取cocos2dx的配置文件
- FJNU/大二下/javascript/事件处理
- C# 显示接口和隐式接口
- Android知识梳理之自定义ViewGroup
- csharp 反编译
- 目标跟踪 详细博文
- 框架的理解
- Android开发:集成dropbox网盘功能
- AJAX POST&跨域 解决方案 - CORS