在游戏中,读取数据是个很常见的功能,很多游戏都需要数据来驱动游戏的运行。在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中写入中文,这样显示出来的文字会乱码,网上有很多转码函数 ,但是还是推荐用这种写入文件方式,读取使用中文,这样你的游戏要是放入国外市场,可以直接修改文件即可,而不用狂翻代码找你写的中文