cocos2dx 解析数据之读取JSON文件

前端之家收集整理的这篇文章主要介绍了cocos2dx 解析数据之读取JSON文件前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

在游戏中,读取数据是个很常见的功能,很多游戏都需要数据来驱动游戏的运行。在cocos2dx中,常用的数据文件类型是json ,csv,lua。


cocos2dx引擎版本:v3.2
开发工具 :vs2013
代码和资源文件链接http://pan.baidu.com/s/1o6tDTyi 密码:rhqx

我们先用excel表格写一个数据文件,来供我们是来使用

用工具导出json文件

读取json文件,我们需要引入两个头文件,cocos2dx里面已经有了,我们直接include就行了

#include "json/rapidjson.h"
#include "json/document.h"

这里我写了三条数据,我就建个结构体

struct data
{
    int                 id;
    std::string         name;
    int                 level;
    std::string         Instruction;
    data() :id(0),level(0)
    {

    }
};
class HelloWorld : public cocos2d::Layer
{
public:
    bool getJsonData(std::string filename,std::vector<data> &vec);
private:
    std::vector<data> _VecData;
    //.....省略了其他不重要代码
}

getJsonData就是我们实现读取的函数

bool HelloWorld::getJsonData(std::string filename,std::vector<data> &vec)
{
    bool ret = false;


    rapidjson::Document doc;
    ssize_t size = 0;
    unsigned char *pBytes = NULL;
    do {
        pBytes = cocos2d::CCFileUtils::getInstance()->getFileData(filename,"r",&size);

        CC_BREAK_IF(pBytes == NULL || strcmp((char*)pBytes,"") == 0);

        std::string load_str((const char*)pBytes,size);

        CC_SAFE_DELETE_ARRAY(pBytes);

        doc.Parse<0>(load_str.c_str());

        CC_BREAK_IF(doc.HasParseError());
        CC_BREAK_IF(!doc.IsArray());

        data mydata;        
        for (rapidjson::SizeType i = 0; i < doc.Size(); i++)
        {
            const rapidjson::Value &p = doc[i];
            if (p.HasMember("ID"))
            {
                mydata.id = p["ID"].GetInt();
            }
            if (p.HasMember("Name"))
            {
                mydata.name = p["Name"].GetString();
            }
            if (p.HasMember("Level"))
            {
                mydata.level = p["Level"].GetInt();
            }
            if (p.HasMember("Intruduction"))
            {
                mydata.Instruction = p["Intruduction"].GetString();
            }


            vec.push_back(mydata);              //将获得的数据放入容器中
        }
        ret = true;

    } while (0);        


    return ret;
}

下面我们测试一下这个函数

bool HelloWorld::init()
{
    //...........省略了其他代码
    if (getJsonData("data.json",_VecData))
    {
        for (auto myData:_VecData)
        {
            CCLOG("%d %s %d %s",myData.id,myData.name.c_str(),myData.level,myData.Instruction.c_str());
        }

    }
    else
    {
        return false;
    }

    return true;
}

运行看输出

我们在用cocos2dx中经常会用到中文,我们也不能直接在vs中写入中文,这样显示出来的文字会乱码,网上有很多转码函数 ,但是还是推荐用这种写入文件方式,读取使用中文,这样你的游戏要是放入国外市场,可以直接修改文件即可,而不用狂翻代码找你写的中文

原文链接:https://www.f2er.com/cocos2dx/342583.html

猜你在找的Cocos2d-x相关文章