cocos2dx 解析数据之读取JSON文件

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

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


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

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

用工具导出json文件

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

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

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

  1. struct data
  2. {
  3. int id;
  4. std::string name;
  5. int level;
  6. std::string Instruction;
  7. data() :id(0),level(0)
  8. {
  9.  
  10. }
  11. };
  1. class HelloWorld : public cocos2d::Layer
  2. {
  3. public:
  4. bool getJsonData(std::string filename,std::vector<data> &vec);
  5. private:
  6. std::vector<data> _VecData;
  7. //.....省略了其他不重要代码
  8. }

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

  1. bool HelloWorld::getJsonData(std::string filename,std::vector<data> &vec)
  2. {
  3. bool ret = false;
  4.  
  5.  
  6. rapidjson::Document doc;
  7. ssize_t size = 0;
  8. unsigned char *pBytes = NULL;
  9. do {
  10. pBytes = cocos2d::CCFileUtils::getInstance()->getFileData(filename,"r",&size);
  11.  
  12. CC_BREAK_IF(pBytes == NULL || strcmp((char*)pBytes,"") == 0);
  13.  
  14. std::string load_str((const char*)pBytes,size);
  15.  
  16. CC_SAFE_DELETE_ARRAY(pBytes);
  17.  
  18. doc.Parse<0>(load_str.c_str());
  19.  
  20. CC_BREAK_IF(doc.HasParseError());
  21. CC_BREAK_IF(!doc.IsArray());
  22.  
  23. data mydata;
  24. for (rapidjson::SizeType i = 0; i < doc.Size(); i++)
  25. {
  26. const rapidjson::Value &p = doc[i];
  27. if (p.HasMember("ID"))
  28. {
  29. mydata.id = p["ID"].GetInt();
  30. }
  31. if (p.HasMember("Name"))
  32. {
  33. mydata.name = p["Name"].GetString();
  34. }
  35. if (p.HasMember("Level"))
  36. {
  37. mydata.level = p["Level"].GetInt();
  38. }
  39. if (p.HasMember("Intruduction"))
  40. {
  41. mydata.Instruction = p["Intruduction"].GetString();
  42. }
  43.  
  44.  
  45. vec.push_back(mydata); //将获得的数据放入容器中
  46. }
  47. ret = true;
  48.  
  49. } while (0);
  50.  
  51.  
  52. return ret;
  53. }

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

  1. bool HelloWorld::init()
  2. {
  3. //...........省略了其他代码
  4. if (getJsonData("data.json",_VecData))
  5. {
  6. for (auto myData:_VecData)
  7. {
  8. CCLOG("%d %s %d %s",myData.id,myData.name.c_str(),myData.level,myData.Instruction.c_str());
  9. }
  10.  
  11. }
  12. else
  13. {
  14. return false;
  15. }
  16.  
  17. return true;
  18. }

运行看输出

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

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