轉載–c++遊戲開發中使用json .

來源:互聯網
上載者:User

最近想寫一個自訂的動畫資料檔案,按照原來的做法,先定義一個文字格式設定的資料檔案,然後寫一個轉換器轉換成二進位,然後遊戲中讀入並解析。不過我最近特別懶,雖然我已經設計了一個“萬能的”文字格式設定和二進位轉換工具,但是解析二進位檔案的工作仍然繁瑣,並且根據以往的經驗,可能會經常的修改檔案格式,於是我想直接使用文字格式設定吧,首先想到的是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寫的。。)

 

 

[javascript] view plaincopyprint?
  1. {  
  2.    "float test" : 1.0,  
  3.    "interger test" : 1,  
  4.    "obj" : {  
  5.       "a" : "obja",  
  6.       "b" : "objb",  
  7.       "c" : 0.130  
  8.    },  
  9.    "str test" : "hello json!"  
  10. }  

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

 

 

測試代碼:

 

[cpp] view plaincopyprint?
  1. #include "json/json.h"   
  2. #include <fstream>   
  3. void testJson()  
  4. {  
  5.     std::ifstream infile("test.json");  
  6.     Json::Value root;  
  7.     Json::Reader reader;  
  8.     bool ok = reader.parse(infile,root); //直接傳入一個ifstream就可以了,全部解析到root中,當然檔案可別太大。。對我來說這種DOM的方式是很適合的   
  9.     if(!ok)  
  10.     {  
  11.         return;  
  12.     }  
  13.     std::string name = root.get("str test","").asString(); //測試讀入屬性值   
  14.     std::cout<<name<<std::endl;  
  15.     //測試寫入屬性值,可直接產生新的索引值對,以及對象,其實我之前的test.json是個空的,都是在這兒寫入的   
  16.     root["interger test"] = 1;  
  17.     root["float test"] = 1.0f;  
  18.     root["obj"]["a"] = "obja";  
  19.     root["obj"]["b"] = "objb";  
  20.     root["obj"]["c"] = 0.13;  
  21.     Json::StyledWriter writer;  
  22.     std::string output = writer.write(root);  
  23.     std::cout<<output;  
  24.     //直接寫入檔案,搞定   
  25.     std::ofstream file("test.json");  
  26.     file<<output;  
  27. }  

#include "json/json.h"<br />#include <fstream><br />void testJson()<br />{<br /> std::ifstream infile("test.json");<br /> Json::Value root;<br /> Json::Reader reader;<br /> bool ok = reader.parse(infile,root); //直接傳入一個ifstream就可以了,全部解析到root中,當然檔案可別太大。。對我來說這種DOM的方式是很適合的<br /> if(!ok)<br /> {<br /> return;<br /> }<br /> std::string name = root.get("str test","").asString(); //測試讀入屬性值<br /> std::cout<<name<<std::endl;<br /> //測試寫入屬性值,可直接產生新的索引值對,以及對象,其實我之前的test.json是個空的,都是在這兒寫入的<br /> root["interger test"] = 1;<br /> root["float test"] = 1.0f;<br /> root["obj"]["a"] = "obja";<br /> root["obj"]["b"] = "objb";<br /> root["obj"]["c"] = 0.13;<br /> Json::StyledWriter writer;<br /> std::string output = writer.write(root);<br /> std::cout<<output;<br /> //直接寫入檔案,搞定<br /> std::ofstream file("test.json");<br /> file<<output;<br />}

 

 

 

使用jsoncpp簡直太輕鬆了,我一句解析代碼都沒有寫,直接從檔案得到了json對象,有了json對象你就可以向你的遊戲資料對象寫入值了,或者作為早期的測試,直接使用json對象也未嘗不可

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.