Cocos2d-x教程-Json解析(高级篇)

发表于2015-12-19
评论2 3.4k浏览

  在上一节中已经说明,2.2.0以上版本的2d-x已经包含了老版本中我们所使用的jsoncpp的文件,所以我们可以直接使用无需引入任何库。下面进入正题....

       在制作游戏的过程中,有很多关于游戏的信息实际上是保存在文件中的,举个例子来说,一款游戏的战斗模块,它的关卡设计需要很多的数据,比如某一关怪物的数量,怪物的刷新时间等等,这些数据都可以保存在文件中,在需要的时候通过某些方法来读取。.json是我们常用的一种格式,下面我们首先来写一个json文件

  {
    "Tollgate": [
        {
            "Type1": {
                "RefreshTime": 0.5,
                "Count": 100
            },
            "Type2": {
                "RefreshTime": 5,
                "Count": 2
            }
        },
        {
            "Type1": {
                "RefreshTime": 0.5,
                "Count": 120
            },
            "Type2": {
                "RefreshTime": 5,
                "Count": 2
            }
        }
    ]
}

这是笔者刚刚写的一个json文件,我们来分析一下它的结构,处于最外层的是 “Tollgate”:[ ] ,Tollgate 代表的是关卡,可以这个键所对应的值是一个数组,我们可以看到数组内包含了两个元素[ { },{ } ], ,事实上这两个元素单独拿出来后又是一个Json格式的数据,也是OC中所说的词典,这两个元素在数组中被默认为第0个元素与第1个元素,此处笔者将第0个元素定义为第1关,将第1个元素定义为第2关;第一关中又包含了两个键值对,第一个键是"Type1",第二个键是"Type2",分别代表两种怪物类型,而每个Type对应的值又是一个词典{ },词典内又包含了两个键值对,分别是"RefreshTime"和"Count",代表怪物的刷新时间与怪物的总数。

下面我们来看一下如何在程序中如何获取到这些数据,新建一个工程,将json文件放到工程目录下,头文件及命名空间不要忘记添加。

1.首先要获取Json文件内的全部数据:

 unsigned long size;

 const char* file = (char*)CCFileUtils::sharedFileUtils()->getFileData("child.json","r", &size);  

通过打印该字符指针 file 我们会在控制台看到Json文件的全部内容

2.通过Reader的parse方法将Json格式转换成一个Value

Reader reader;

Value root;

reader.parse(std::string(file),root,false);

3.获取到Value中的Tollgate所对应的Value,也就是一个数组

Value array;

array=root.get("Tollgate",NULL);

get函数的第二个参数代表找不到Tollgate对应的Value时的默认Value

4.数组中共有两个元素,我们现在获取第一个元素中的Type1中,Count所对应的Value

Value count;

count=array[0]["Type1"].get("Count",NULL);

5.此时的count是一个Value类型,我们需要将其转换为整型,然后输出

CCLOG("%d",count.asInt());

输出后可运行看到结果为100。

这就是解析Json文件的全过程,我们会觉得有些繁琐,下面笔者将这个过程做一个简单的封装。

新建一个类,笔者命名为AnalysisJson,.h文件中代码如下:

.cpp文件代码如下:


在HelloWorld中引入AnalysisJson头文件,然后创建一个对象,并调用获取怪物刷新时间与数量的方法:


运行项目控制台输出结果:


这样便完成了一个Json解析。


如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引