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