cocos2d-x 在XML分析和数据存储

无意中起到一周中的游戏,哎,时间过得总是打得那么快时,。

。。

于是今天决定看一下之前不怎么非常熟悉的XML;(之前做游戏时数据的储存用到过XML。但这块是还有一个同事在做,所以不怎么熟悉),

看了看他写的xml和解析方法,然后自己改进了下,所以来简单的总结和分享分享

主要涉及到的有:

1. xml 创建

2.xml的解析

3.将解析后的xml数据用vector保存起来;

例如以下:(写完xml后,最简单的检查语法错误就是用IE浏览器打开看看,能够打开则说明语法没错)

<?xml version="1.0" encoding="utf-8"?

>
<Mineral>
	<mineral>
		<type>1</type>
		<times>100</times>
		<p>20</p>
	</mineral>

	<mineral>
		<type>4</type>
		<times>100</times>
		<p>20</p>
	</mineral>

	<mineral>
		<type>5</type>
		<times>100</times>
		<p>20</p>
	</mineral>

</Mineral>

在这里我依照网上的XML书写格式新建了一个名为 "Mineral.xml"的xml;

(Mineral就是矿的意思,xml 中我任意写了3中类型的矿石。每种矿石有自己的类型、倍率、概率)

然后将其保存在资源目录里面,然后新建一个cocos2d-x项目,

以下贴出主要解析代码

//.h文件

#ifndef __HELLOWORLD_SCENE_H__
#define __HELLOWORLD_SCENE_H__

#include "cocos2d.h"
#include <string>
#include <vector>

typedef struct Mineral
{
	int times ;
	int type;
	int p;

}*PtrMineral;

class HelloWorld : public cocos2d::CCLayer
{
public:
    virtual bool init();
    static cocos2d::CCScene* scene();
    void menuCloseCallback(CCObject* pSender);
    bool readMinearlXml();
	void displayVec();
    CREATE_FUNC(HelloWorld);
private:
	std::vector<PtrMineral >m_pMineralVec ;
};

#endif

//.cpp文件

#include "HelloWorldScene.h"
#include "../support/tinyxml2/tinyxml2.h"

using namespace tinyxml2;
USING_NS_CC;

CCScene* HelloWorld::scene()
{

    CCScene *scene = CCScene::create();
    HelloWorld *layer = HelloWorld::create();
    scene->addChild(layer);
    return scene;
}

bool HelloWorld::init()
{
    if ( !CCLayer::init() )
    {
        return false;
    }
	readMinearlXml();
	displayVec();
    return true;
}

bool HelloWorld::readMinearlXml()
{
	tinyxml2::XMLDocument* xmlData = new tinyxml2::XMLDocument();
	unsigned long nSize ;
	const char *pXmlBuffer = (const char*)CCFileUtils::sharedFileUtils()->getFileData("XML/Mineral.xml","rb",&nSize);

	if( NULL == pXmlBuffer )
	{
		CCLOG("read Mineral.xml Failed");
	}
	else
		CCLOG("star read Mineral.xml");

	xmlData->Parse(pXmlBuffer,nSize);
	XMLElement *rootNode = xmlData->RootElement();
	if(!rootNode)
	{
		return false;
	}
	XMLElement* curNode = rootNode->FirstChildElement("mineral");

	while(NULL!= curNode)
	{
		PtrMineral pMineral =new Mineral();
		pMineral->type  = (atoi)( (curNode->FirstChildElement("type"))->GetText() );
		pMineral->times = (atoi)( (curNode->FirstChildElement("times"))->GetText() );
		pMineral->p     = (atoi)( (curNode->FirstChildElement("p"))->GetText() );
		m_pMineralVec.push_back(pMineral);
		curNode = curNode->NextSiblingElement("mineral");
	}
	delete xmlData;
	return true;

}
void HelloWorld::displayVec()
{
	CCLOG("*********m_pMineralVec*********");
	for(int i = 0 ; i<m_pMineralVec.size() ; i++)
	{
		CCLOG("<mineral>");
		CCLOG("	<type> = %i </type>",m_pMineralVec[i]->type);
		CCLOG("	<times> = %i </times>",m_pMineralVec[i]->times);
		CCLOG("	<p>     = %i </p>",m_pMineralVec[i]->p);
		CCLOG("</mineral>");

	}

}

void HelloWorld::menuCloseCallback(CCObject* pSender)
{
#if (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT) || (CC_TARGET_PLATFORM == CC_PLATFORM_WP8)
	CCMessageBox("You pressed the close button. Windows Store Apps do not implement a close button.","Alert");
#else
    CCDirector::sharedDirector()->end();
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
    exit(0);
#endif
#endif
}

上面分别包括了xml的解析即xml的数据显示:

显演示样例如以下:

star read Mineral.xml
*********m_pMineralVec*********
<mineral>
	<type> = 1 </type>
	<times> = 100 </times>
	<p>     = 20 </p>
</mineral>
<mineral>
	<type> = 4 </type>
	<times> = 100 </times>
	<p>     = 20 </p>
</mineral>
<mineral>
	<type> = 5 </type>
	<times> = 100 </times>
	<p>     = 20 </p>
</mineral>

控制节目。输出和以前创建xml一致性,就这样,xml在分辨率ok 该,它不是很easy啊

时间: 2024-11-10 19:35:05

cocos2d-x 在XML分析和数据存储的相关文章

cocos2d-x 中XML解析与数据存储

一不小心就玩了一周的游戏了.哎.玩的时候时间过得总是这么快... 于是今天决定看一下之前不怎么非常熟悉的XML;(之前做游戏时数据的储存用到过XML,但这块是还有一个同事在做,所以不怎么熟悉), 看了看他写的xml和解析方法.然后自己改进了下.所以来简单的总结和分享分享 主要涉及到的有: 1. xml 创建 2.xml的解析 3.将解析后的xml数据用vector保存起来. 例如以下:(写完xml后,最简单的检查语法错误就是用IE浏览器打开看看,能够打开则说明语法没错) <?xml versio

Android与iOS开发对比系列】之 数据存储

Android与iOS开发对比系列]之 数据存储 写在前面的话 相比Android和iOS,我觉得Android的数据存储更开放一些.Android天生就可以使用多Java I/O:并且天生开放的特性,开发者可以直接在SD卡中读写文件,自由度比较高.缺点吗,也是因为太开放,所以Android的相册和文件夹都惨不忍睹. Android本身自带Java的反射和注解,很早就有了ORM数据库.这里解释一下,ORM就是 Object Relation Mapping, 对象关系映射. 通过建立对象来生成数

无废话Android之android下junit测试框架配置、保存文件到手机内存、android下文件访问的权限、保存文件到SD卡、获取SD卡大小、使用SharedPreferences进行数据存储、使用Pull解析器操作XML文件、android下操作sqlite数据库和事务(2)

1.android下junit测试框架配置 单元测试需要在手机中进行安装测试 (1).在清单文件中manifest节点下配置如下节点 <instrumentation android:name="android.test.InstrumentationTestRunner" android:targetPackage="com.example.demo1" /> 上面targetPackage指定的包要和应用的package相同. (2)在清单文件中ap

16_Android的数据存储_ SharedPreference、XML和JSON

1. Android读写首选项 1.1 SharedPreferences SharedPreferences 是一种轻型的数据存储方式,它的本质是基于XML文件存储Key-Value键值对数据,通常用来存储一些简单的配置信息,其存储位置在/data/data/<包名>/shared_prefs目录下. SharedPreferences对象本身只能获取数据而不支持存储和修改,存储修改是通过Editor对象实现.本例程讲解 SharedPreference 数据的读写操作. 1 package

Android 存储文件方式之一---SharedPreferences 内容提供者,以xml 的方式进行数据 存储。是一种轻量级的文件数据存储

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 //UI界面的布局 文件<br><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:tools="http://schemas.android.com/tools"

iOS开发UI篇—ios应用数据存储方式(XML属性列表-plist)

一.ios应用常用的数据存储方式 1.plist(XML属性列表归档) 2.偏好设置 3.NSKeydeArchiver归档(存储自定义对象) 4.SQLite3(数据库,关系型数据库,不能直接存储对象,要编写一些数据库的语句,将对象拆开存储) 5.Core Data(对象型的数据库,把内部环节屏蔽) 二.应用沙盒 每个iOS应用都有?己的应?沙盒(应用沙盒就是文件系统目录),与其他文件系统隔离.应?必须待在?己的沙盒里,其他应用不能访问该沙盒(提示:在IOS8中已经开放访问) 应?沙盒的文件系

iOS 应用数据存储方式(XML属性列表-plist)

iOS 应用数据存储方式(XML属性列表-plist) 一.ios应用常用的数据存储方式 1.plist(XML属性列表归档) 2.偏好设置 3.NSKeydeArchiver归档(存储自定义对象) 4.SQLite3(数据库,关系型数据库,不能直接存储对象,要编写一些数据库的语句,将对象拆开存储) 5.Core Data(对象型的数据库,把内部环节屏蔽) 二.应用沙盒 每个iOS应用都有?己的应?沙盒(应用沙盒就是文件系统目录),与其他文件系统隔离.应?必须待在?己的沙盒里,其他应用不能访问该

Unity3d数据存储 PlayerPrefs,XML,Json数据的存储与解析

今天来复习一下数据存储方面的基础知识,Unity3d中常用的数据存储方式有Unity自带的PlayerPrefs, XML文档, Json文档,还有常用的轻量级数据库SQL, 涉及的琐碎知识非常多,在这里自己归纳总结一下,方便日后温故而知新. PlayerPrefs存储数据 PlayerPrefs的存储方式非常简单,但可用性不强,一般只用于调试过程存储少量数据,很少大范围使用 适用设备:Mac OSX, Linux, Windows,Web Players 存储机制:Key-Value (类似于

Android 测试、数据存储与访问、XML解析与生成

1.android测试 1.黑盒测试: 是以用户的角度,从输入数据与输出数据的对应关系出发进行测试的. 2. 白盒测试: 又称结构测试.透明盒测试.逻辑驱动测试或基于代码的测试. 3.单元测试: 又称模块测试,是开发者编写的一小段代码,用于检验被测代码的一个很小的.很明确的功能是否正确. 4.功能测试: 根据产品特性.操作描述和用户方案,测试一个产品的特性和可操作行为以确定它们满足设计需求. 5.压力测试: 主体向被观察者布置一定量任务和作业,借以观察个体完成任务的行为. 6.集成测试: 是单元