c++游戏开发中使用json

http://blog.csdn.net/n5/archive/2009/11/29/4902008.aspx

最近想写一个自定义的动画数据文件,按照原来的做法,先定义一个文本格式的数据文件,然后写一个转换器转换成二进制,然后游戏中读入并解析。不过我最近特别懒,虽然我已经设计了一个“万能的”文本格式和二进制转换工具,但是解析二进制文件的工作仍然繁琐,并且根据以往的经验,可能会经常的修改文件格式,于是我想直接使用文本格式吧,首先想到的是XML,不过最近实在太懒了,连XML都懒得去解析,嗯,还有google Protocol Buffers这东西,以前看过,不过似乎用的人不多啊,还有一个json,见人在游戏中用过,那么就试试他吧。。

 找了几个c++的json解析器,最后选中了jsoncpp (http://jsoncpp.sourceforge.net )。首先jsoncpp是public domain的,那么就随便我怎么用了,太爽了,然后他使用的是标准c++,没有任何其他依赖(某些库还要依赖boost等东西),最后他很小巧,只有15个源文件,我直接把这些文件copy到工程里就编译了,省去了lib的配置编译连接设定等等(既然懒就懒到底了。。。),直接看文档,用法非常简单,我写了一个简单的json文件作为测试(其实是用jsoncpp的styled writer写的。。)

view plaincopy to clipboardprint?
{  
   "float test" : 1.0,  
   "interger test" : 1,  
   "obj" : {  
      "a" : "obja",  
      "b" : "objb",  
      "c" : 0.130  
   },  
   "str test" : "hello json!" 

{
   "float test" : 1.0,
   "interger test" : 1,
   "obj" : {
      "a" : "obja",
      "b" : "objb",
      "c" : 0.130
   },
   "str test" : "hello json!"
}

测试代码:

view plaincopy to clipboardprint?
#include "json/json.h"  
#include <fstream>  
void testJson()  
{  
    std::ifstream infile("test.json");  
    Json::Value root;  
    Json::Reader reader;  
    bool ok = reader.parse(infile,root); //直接传入一个ifstream就可以了,全部解析到root中,当然文件可别太大。。对我来说这种DOM的方式是很适合的  
    if(!ok)  
    {  
        return;  
    }  
    std::string name = root.get("str test","").asString(); //测试读入属性值  
    std::cout<<name<<std::endl;  
    //测试写入属性值,可直接生成新的键值对,以及对象,其实我之前的test.json是个空的,都是在这儿写入的  
    root["interger test"] = 1;  
    root["float test"] = 1.0f;  
    root["obj"]["a"] = "obja";  
    root["obj"]["b"] = "objb";  
    root["obj"]["c"] = 0.13;  
    Json::StyledWriter writer;  
    std::string output = writer.write(root);  
    std::cout<<output;  
    //直接写入文件,搞定  
    std::ofstream file("test.json");  
    file<<output;  

#include "json/json.h"
#include <fstream>
void testJson()
{
    std::ifstream infile("test.json");
    Json::Value root;
    Json::Reader reader;
    bool ok = reader.parse(infile,root); //直接传入一个ifstream就可以了,全部解析到root中,当然文件可别太大。。对我来说这种DOM的方式是很适合的
    if(!ok)
    {
        return;
    }
    std::string name = root.get("str test","").asString(); //测试读入属性值
    std::cout<<name<<std::endl;
    //测试写入属性值,可直接生成新的键值对,以及对象,其实我之前的test.json是个空的,都是在这儿写入的
    root["interger test"] = 1;
    root["float test"] = 1.0f;
    root["obj"]["a"] = "obja";
    root["obj"]["b"] = "objb";
    root["obj"]["c"] = 0.13;
    Json::StyledWriter writer;
    std::string output = writer.write(root);
    std::cout<<output;
    //直接写入文件,搞定
    std::ofstream file("test.json");
    file<<output;
}

使用jsoncpp简直太轻松了,我一句解析代码都没有写,直接从文件得到了json对象,有了json对象你就可以向你的游戏数据对象写入值了,或者作为早期的测试,直接使用json对象也未尝不可

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值