cocos2d-x 读写 xml 文件

A product of cheungmine

使用cocos2d-x开发2d游戏确实方便,但是对于一般的小游戏,经常需要的工作是UI布局设计和调整,代码改来改去,真不方便。现成的Cocos Studio或者SpriteBuilder当然更适合设计游戏。作为程序员,如果想在纯命令行模式下开发游戏,早晚要有自己的UI模块。不妨称之为cocos2d-layout。cocos2d-layout相当于舞台的布景。布景师根据导演的要求(xml)来生成舞台。布景师在现实生活中当然是人来做,在程序里就是一段程序或代码库。这个没用通用的万能的库可以做这个事情,因为游戏的内容是差别很大的。因此一个好的游戏开发师的工具箱里肯定有这样一个瑞士军刀。敝人刚入门,就从最简单的代码开始。

使用xml来做这样的配置是最适合不过的。cocos2d-x提供了读写xml的C++库tinyxml2(https://github.com/leethomason/tinyxml2),当然是开源的,使用起来相当简单:

#include "tinyxml2/tinyxml2.h"

using namespace tinyxml2;

在你的cocos2d代码中放入下面的代码,调用之:

static void makeXml(const char *fileName)
{
    std::string filePath = FileUtils::getInstance()->getWritablePath() + fileName;

    tinyxml2::XMLDocument *pDoc = new tinyxml2::XMLDocument();

    //xml 声明(参数可选)
    XMLDeclaration *pDel = pDoc->NewDeclaration("xml version=\"1.0\" encoding=\"UTF-8\"");
    pDoc->LinkEndChild(pDel);
    //添加plist节点
    XMLElement *plistElement = pDoc->NewElement("plist");
    plistElement->SetAttribute("version", "1.0");
    pDoc->LinkEndChild(plistElement);
    XMLComment *commentElement = pDoc->NewComment("this is xml comment");
    plistElement->LinkEndChild(commentElement);
    //添加dic节点
    XMLElement *dicElement = pDoc->NewElement("dic");
    plistElement->LinkEndChild(dicElement);
    //添加key节点
    XMLElement *keyElement = pDoc->NewElement("key");
    keyElement->LinkEndChild(pDoc->NewText("Text"));
    dicElement->LinkEndChild(keyElement);
    XMLElement *arrayElement = pDoc->NewElement("array");
    dicElement->LinkEndChild(arrayElement);
    for (int i = 0; i<3; i++) {
        XMLElement *elm = pDoc->NewElement("name");
        elm->LinkEndChild(pDoc->NewText("Cocos2d-x"));
        arrayElement->LinkEndChild(elm);
    }
    pDoc->SaveFile(filePath.c_str());
    pDoc->Print();
    delete pDoc;
}

static void parseXML(const char *fileName)
{
    std::string filePath = FileUtils::getInstance()->getWritablePath() + fileName;
    tinyxml2::XMLDocument *pDoc = new tinyxml2::XMLDocument();
    XMLError errorId = pDoc->LoadFile(filePath.c_str());
    if (errorId != 0) {
        //xml格式错误
        return;
    }
    XMLElement *rootEle = pDoc->RootElement();
    //获取第一个节点属性
    const XMLAttribute *attribute = rootEle->FirstAttribute();
    //打印节点属性名和值
    log("attribute<em>name = %s,attribute</em>value = %s", attribute->Name(), attribute->Value());
    XMLElement *dicEle = rootEle->FirstChildElement("dic");
    XMLElement *keyEle = dicEle->FirstChildElement("key");
    if (keyEle) {
        log("keyEle Text= %s", keyEle->GetText());
    }
    XMLElement *arrayEle = keyEle->NextSiblingElement();
    XMLElement *childEle = arrayEle->FirstChildElement();
    while ( childEle ) {
        log("childEle Text= %s", childEle->GetText());
        childEle = childEle->NextSiblingElement();
    }
    delete pDoc;
}

当然上面的代码是网上搜来的。只是一个例子。如果想用C来解析xml,有很多选择:libxml,expat, ezxml等。我发现一个很优秀的库:mini-xml。http://www.msweet.org/projects.php?Z3

Mini-XML is a small XML library that you can use to read and write XML
and XML-like data files in your application without requiring large
non-standard libraries. 

Mini-XML only requires an ANSI C compatible compiler (GCC works, as do
 most vendors' ANSI C compilers) and a 'make' program.

Mini-XML supports reading of UTF-8 and UTF-16 and writing of UTF-8
encoded XML files and strings. Data is stored in a linked-list tree
structure, preserving the XML data hierarchy, and arbitrary element
 names, attributes, and attribute values are supported with no
 preset limits, just available memory.

那么我准备用这个来做cocos2d-layout。

cocos2d-x 读写 xml 文件的更多相关文章

  1. C#读写xml文件的常用方法

    已知有一个XML文件(bookshop.xml)如下: <?xml version="1.0" encoding="gb2312" ?> <b ...

  2. PHP读写XML文件的四种方法

    PHP对XML文件进行读写操作的方法一共有四种,分别是:字符串方式直接读写.DOMDocument读写. XMLWrite写和XMLReader读.SimpleXML读写,本文将依次对这四种方法进行介 ...

  3. Java 读写XML文件 API--org.dom4j

    om4j是一个Java的XML API,类似于jdom,用来读写XML文件的.dom4j是一个十分优秀的JavaXML API,具有性能优异.功能强大和极其易使用的特点,同时它也是一个开放源代码的软件 ...

  4. Fixflow引擎解析(三)(模型) - 创建EMF模型来读写XML文件

    Fixflow引擎解析(四)(模型) - 通过EMF扩展BPMN2.0元素 Fixflow引擎解析(三)(模型) - 创建EMF模型来读写XML文件 Fixflow引擎解析(二)(模型) - BPMN ...

  5. java通过dom读写xml文件

    java通过dom读写xml文件 要读的xml文件 <?xml version="1.0" encoding="GB2312"?><学生花名册 ...

  6. C# 读写XML文件的方法

    C# 读写XML文件的方法 一.写XML文件 XmlDocument xmlDocument = new XmlDocument();xmlDocument.AppendChild(xmlDocume ...

  7. VC 使用msxml6.dll动态链接库中的函数读写XML文件

    VC 使用msxml6.dll动态链接库中的函数读写XML文件 目录 1 引言 2 .dll使用方法 3 常用函数总结 4 实例应用 5 运行效果预览 6 补充说明 7 不足之处 8 更新   引言: ...

  8. 【VS开发】【计算机视觉】OpenCV读写xml文件《C++版本》

    OpenCV FileStorage类读写XML/YML文件 在OpenCV程序中,需要保存中间结果的时候常常会使用.xml / .yml文件,opencv2.0之前都是使用C风格的代码,当时读写XM ...

  9. Spring读写xml文件

    一.如果只是读取 新建一个 xml 文件,需要满足Spring格式: <?xml version="1.0" encoding="UTF-8"?> ...

随机推荐

  1. Android图表库MPAndroidChart(一)——了解他的本质,方能得心应手

    Android图表库MPAndroidChart(一)--了解他的本质,方能得心应手 我们项目中经常会遇到一些统计图,比如折线图,线形图等,在一些运动健康类的App中尤其的常见,这画起来要命,我以前就 ...

  2. 用Python最原始的函数模拟eval函数的浮点数运算功能

    前几天看一个网友提问,如何计算'1+1'这种字符串的值,不能用eval函数. 我仿佛记得以前新手时,对这个问题完全不知道如何下手. 我觉得处理括号实在是太复杂了,多层嵌套括号怎么解析呢?一些多余的括号 ...

  3. 高德地图车机版API演示程序

    高德地图车机版API演示程序 做车载的应该和这个程序打交道打的比较多吧,这里是我今天写的一个实现了他的API的一个演示程序 首先我们来看下他的官网. http://lbs.amap.com/api/a ...

  4. 21 viewPager--- hzScrollView ----llContainer

    结构: MainActivity.java package com.qf.day21_hsviewpagerfragment_demo5; import java.util.ArrayList; im ...

  5. Android 字体设置-Typeface讲解

    控件的字体设置的两种方式 常用的字体类型名称还有: Typeface.DEFAULT //常规字体类型 Typeface.DEFAULT_BOLD //黑体字体类型 Typeface.MONOSPAC ...

  6. Android上下文菜单ContentView详解

    ContentView介绍 上下文菜单继承了android.view.Menu,因此我们可以像操作Options Menu那样给上下文菜单增加菜单项.上下文菜单与Options Menu最大的不同在于 ...

  7. windows下安装nginx (转载自:http://blog.163.com/njut_wangjian/blog/static/1657964252013327103716818/)

    1.  到nginx官网上下载相应的安装包,http://nginx.org/en/download.html:下载进行解压,将解压后的文件放到自己心仪的目录下,我的解压文件放在了d盘根目录下,如下图 ...

  8. EBS的性能调优

         metalink    Tuning performance on eBusiness suite (Doc ID 744143.1) 这篇文档描述了如何调查电子商务套件的整体性能下降. ...

  9. IBM SPSS 实习总结

    2015过完年,我知道导师要出国了,自己也算是水了一个idea 的论文.希望研二能找个实习,早听说西安IBM这边有学长在里面实习过,2月底联系了一下简历就塞了过去.面试就在锦业一路软件园他们上班的地方 ...

  10. Linux Debugging(六): 动态库注入、ltrace、strace、Valgrind

    实际上,Linux的调试方法非常多,针对不同的问题,不同的场景,不同的应用,都有不同的方法.很难去概括.本篇文章主要涉及本专栏还没有涵盖,但是的确有很重要的方法.本文主要包括动态库注入调试:使用ltr ...