本站文章均为李华明Himi原创,转载务必在明显处注明:
转载自【黑米GameDev街区】原文链接:http://www.himigame.com/iphone-cocos2dx/694.html
☞ 点击订阅 ☜本博客最新动态!及时将最新博文通知您!
本章Himi给大家分享如何在Cocos2dX中解析xml数据;对于数据存取有很多方式,流文件,plist,xml等,那么为了跨平台更好的支持,Himi想到之前写的CCUserDefault 存储数据一节,Cocos2dx自带的存储类,一旦存入数据都会以xml格式进行保存,适用于iOS、Android等平台,所以这里Himi使用xml进行游戏的一些数据录入 = =.. 另外一方面Himi本章节也是基于Cocos2dx引擎代码进行的一次简单对xml数据解析的封装;
为了更保险的去考虑跨平台,所以对于xml存储这块的解析,也做了些搜索,最后发现王哥(王哲-cocos2dx引擎作者)也有给我们提示过,内容如下:
1
2
3
|
cocos2dx里面集成了libxml2,ios上会调用sdk里面内置的,
android和win32上则带了已经编译好的静态/动态库。
你可以参考CCSAXParser里面的代码来使用libxml2
|
那么既然如此,就对Cocos2dx引擎源码的CCSAXParser类进行了剖析,那么这里Himi,先给出代码,然后再详细讲解下:
Himi封装的HXmlParse类:
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
HXmlParse.h
#ifndef HAnimation_HXmlParse_h
#define HAnimation_HXmlParse_h
#include "cocos2d.h"
#include "CCSAXParser.h"
#include "CCObject.h"
#include "CCMutableDictionary.h"
using namespace cocos2d;
class CC_DLL HXmlParse : public CCObject, public CCSAXDelegator
{
public :
static HXmlParse * parserWithFile( const char *tmxFile);
bool initHXmlParse( const char * xmlName);
void startElement( void *ctx, const char *name, const char **atts);
void endElement( void *ctx, const char *name);
void textHandler( void *ctx, const char *ch, int len);
std::string root_name;
bool isJumpHeadData;
CCMutableDictionary<std::string,CCString*> *mDic;
private :
std::string startXmlElement;
std::string endXmlElement;
std::string currString;
};
#endif
|
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
|
HXmlParse.cpp
#include "HXmlParse.h"
#include "CCSAXParser.h"
HXmlParse * HXmlParse::parserWithFile( const char *tmxFile)
{
HXmlParse *pRet = new HXmlParse();
if (pRet->initHXmlParse(tmxFile))
{
pRet->autorelease();
return pRet;
}
CC_SAFE_DELETE(pRet);
return NULL;
}
bool HXmlParse::initHXmlParse( const char * xmlName)
{
mDic = new CCMutableDictionary<std::string,CCString*>();
CCSAXParser _par;
if ( false == _par.init( "UTF-8" ) )
{
CCLog( "-----请使用utf-8格式!" );
return false ;
}
_par.setDelegator( this );
const char * _path =CCFileUtils::fullPathFromRelativePath(xmlName);
return _par.parse(_path);
}
void HXmlParse::startElement( void *ctx, const char *name, const char **atts)
{
CC_UNUSED_PARAM(ctx);
startXmlElement = ( char *)name;
if (!isJumpHeadData){
CCLog( "------跳过root name" );
isJumpHeadData= true ;
root_name=startXmlElement;
return ;
}
}
void HXmlParse::endElement( void *ctx, const char *name)
{
CC_UNUSED_PARAM(ctx);
endXmlElement = ( char *)name;
if (endXmlElement==root_name){
CCLog( "读取xml结束" );
isJumpHeadData= false ;
root_name= "" ;
return ;
}
}
void HXmlParse::textHandler( void *ctx, const char *ch, int len)
{
CC_UNUSED_PARAM(ctx);
currString=string(( char *)ch,0,len);
CCString *ccStr = new CCString();
ccStr->m_sString=currString;
if (root_name!= "" ){
mDic->setObject(ccStr,startXmlElement);
CCLog( "-----key:%s, value:%s" ,startXmlElement.c_str(),mDic->objectForKey(startXmlElement)->m_sString.c_str());
}
}
|
OK,代码呢我们先从.h中来说,首先我们使用CCSAXDelegator,为了让CCSAXParser解析数据后将数据回调给如下三个函数:
1
2
3
4
5
6
7
|
void startElement( void *ctx, const char *name, const char **atts);
void endElement( void *ctx, const char *name);
void textHandler( void *ctx, const char *ch, int len);
|
startElement 函数解析的是xml的每个key前字段
textHandler 函数解析出来的是xml每个key对应的value值
endElement 函数解析出来的是xml的每个key后字段
这里Himi随便写了一个xml来做测试,himi.xml,如下:
1 |
<?xml version= "1.0" encoding= "utf-8" ?><himiTestData><key1>1000</key1><key2>娃哈哈</key2><key3>82.3</key3><key4>4000</key4><key5>himi</key5><key6> true </key6></himiTestData>
|
那么CCSAXParser类解析第一次回调 startElement 是读取的是root name(xml数据头标识名称->“<himiTestData>”),然后才读取正式数据key和value,最后读取的也是xml数据尾标识名称“</himiTestData>”
当然在Himi封装的HXmlParse类中对于数据标识的读取都跳过了,使用变量isJumpHeadData来处理的;
其他的都很容易没有什么可说的,主要要说还有一点就是关于CCMutableDictionary的使用,对于此类主要结构是形成map&NSMutableDictionary类似是个键值对容器,key-value;那么使用时候要注意4点:
1. 比如Himi解析数据后都会默认将key和value数据存放在CCMutableDictionary中,那么这里我肯定传入的是两个string,但是细心的童鞋会发现代码中第二个并不是std::string,而是CCString对象,嗯 没错,CCMutableDictionary要求传入的是CCObject对象而不是基本类型!CCString中有m_sString这个属性,所以转换起来也是很方便的;
2. 使用CCMutableDictionary进行添加数据setObject的时候要注意此函数的两个参数:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
bool setObject(_ValueT pObject, const _KeyT& key)
{
pair<CCObjectMapIter, bool > pr;
pr = m_Map.insert( Int_Pair(key, pObject) );
if (pr.second == true )
{
pObject->retain();
return true ;
}
return false ;
}
|
上面这个是cocos2dx引擎中源码中setObject函数实现代码,这里可以很清晰的看到,第一个参数表示《CCObject》,第二个参数才是《Key》!这点对于之前做过java开发的我来说比较郁闷,因为一般都是key在第一个参数。。。。。
3. 请大家仔细看HXmlParse.cpp类中的备注3 ,当你使用CCMutableDictionary的setObject函数的时候,务必要注意,此函数的存入的CCObject参数,引擎中实现代码是对你这个CCObject进行retain()的一个内存地址引用!也就是说这里不要使用一个成员变量来使用,否则你从CCMutableDictionary取出来的数据全部是你最后一个CCObject数据!
4.CCMutableDictionary是cocos2d-x自己封装的类,功能类似NSMutableDictionary。但是Himi通过测试发现!它有一点和NSMutableDictionary是不一样的。NSMutableDictionary的setObjectForKey方法是:如果发现这个key已经存在于字典中的时候,它会自动用新的object覆盖掉原有的object。而CCMutableDictionary由于它是使用map实现的字典功能,而在map里面,如果key已存在,是不会用新的object覆盖掉原有object的。在使用CCMutableDictionary的时候需要特别注意这一点。
HXmlParse解析xml类使用方法很简单:
1
2
3
|
#include "HXmlParse.h"
HXmlParse::parserWithFile( "himi.xml" );
|
然后Himi为了证实此解析类在Android也可以正常运行,那么这里Himi将读出的数据展示在画面上,iOS运行截图如下:
分享到:
相关推荐
Cocos2d-x-3.x游戏开发之旅-钟迪龙著 全新pdf版和附书代码(代码为工程文件,可复制) 附带目录标签
【iOS-Cocos2d游戏开发】Cocos2d-iPhone动作Action-扩展动作 http://blog.csdn.net/tt5267621/article/details/7626450
quick-cocos2d-x v3 是在 cocos2dx 3.x 的最新版本基础之上,移植了原来 quick-cocos2d-x 的核心框架、强大的 player 、丰富的示例等,并增加更多新的功能。 GitHub: https://github.com/dualface/v3quick
4、【cocos2d-x IOS游戏开发-捕鱼达人4】基本游戏框架 资源引用页: 5、【cocos2d-x IOS游戏开发-捕鱼达人5】C++中函数代理与信号插槽机制 资源引用页: 6、【cocos2d-x IOS游戏开发-捕鱼达人6】实现开始菜单 资源...
资源名称:大富翁手机游戏开发实战基于Cocos2d-x3.2引擎内容简介:李德国编著的《大富翁手机游戏开发实战(基于 Cocos2d-x3.2引擎)》使用Cocos2d-x游戏引擎技术,带领读者一步一步从零开始进行大富翁移动游戏的开发...
资源名称:Cocos2D-X游戏开发技术精解内容简介:Cocos2D-X是一款支持多平台的 2D手机游戏引擎,支持iOS、Android、BlackBerry等众多平台。当前,很多移动平台流行的游戏,都是基于Cocos2D-X开发的。 《Cocos2D-X...
【iOS-Cocos2d游戏开发】Cocos2d-iPhone动作Action-瞬时动作 http://blog.csdn.net/tt5267621/article/details/7624781
Cocos2d-x 3.x游戏开发之旅教程及完整源码下载,使用最新cocos2d-x-3.14版本,在xcode7.3上已编译通过。 解决相关问题 1、解决源程序在高版本上无法编译问题 2、解决源程序中文注释部分,xcode上显示乱码问题 使用...
Cocos2d-x 3.x游戏开发实战pdf含目录,内容详细,强烈推荐给大家。
精通COCOS2D-X游戏开发 精通COCOS2D-X游戏开发 精通COCOS2D-X游戏开发 精通COCOS2D-X游戏开发 精通COCOS2D-X游戏开发
《Cocos2D-X游戏开发技术精解》详细介绍如何使用Cocos2D-X引擎开发自己的移动平台游戏。全书共15章,主要内容包括:Cocos2D-X引擎简介;如何建立跨平台的开发环境;引擎的核心模块——渲染框架;如何实现动态画面和...
本书是《Cocos2d-x 游戏开发之旅》的升级版,修改了2.0版进阶到3.0版后的一些内容,新增了对CocoStudio、UI编辑器、Cocos2d-x 3.0新特性以及网络方面的知识点。主要介绍常用的API使用方式;介绍如何通过官方Demo获取...
9、【cocos2d-x IOS游戏开发-捕鱼达人9】鱼与动画 资源引用页: 10、【cocos2d-x IOS游戏开发-捕鱼达人10】鱼的产生和移动 资源引用页: 11、【cocos2d-x IOS游戏开发-捕鱼达人11】鱼的产生和移动:完善 资源引用页...
cn.cocos2d-x.org上quick-cocos2d-x初学者教程的代码与资源。原始资源100多M,这个仅保留资源与代码,不包含quick 3.3 Final的框架代码。下载后可以用quick 3.3 player直接玩。
【iOS-Cocos2d游戏开发】Cocos2d-iPhone动作Action-组合动作 http://blog.csdn.net/tt5267621/article/details/7626137
资源名称:Cocos2d-x实战:JS卷——Cocos2d-JS开发内容简介:本书是介绍Cocos2d-x游戏编程和开发技术书籍,介绍了使用Cocos2d-JS中核心类、瓦片地图、物理引擎、音乐音效、数据持久化、网络通信、性能优化、多平台...
Mac-OS-X-配置-Cocos2d-x-开发环境(iOS-和-Android).doc
cocos2d-x 3.x游戏开发实战光盘
资源为教学视频,有iOS基础熟悉XCode基本上不难学会,主要讲了一些Cocos2d游戏开发引擎中的一些具体调用
Cocos2d-x项目实战-射击类游戏-迷失航线,版本是Cocos2d-x-3.2