【COCOS2D-X(1.X 2.X) Json(cpp版)及新加字體庫篇】在Cocos2dx引擎中封裝、解析Json(cpp版)數據以及添加自定義字體庫 .

本站文章均爲 李華明Himi 原創,轉載務必在明顯處註明:(作者新浪微博: @李華明Himi 
轉載自【黑米GameDev街區】 原文鏈接: http://www.himigame.com/iphone-cocos2dx/1492.html
 

          ☞ 點擊訂閱 ☜
 本博客最新動態!及時將最新博文通知您!

    不知道改先說些什麼,又是一個好久沒寫博客的階段了啊~(很多童鞋也應該發現Himi隱匿了…)

最近一段時間呢,主要還是太忙,各種忙。對於博客,Himi自己的還是經常關注的,主要沒有什麼可寫的了,哈哈。不過一旦有可以分享的,一定第一時間發出來~

好了  不閒扯了,今天來給童鞋們介紹如何在Cocos2dx中解析、封裝JSON數據的教學。

    首先了JSON相關知識: 

1
JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式。它基於JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一個子集。 JSON採用完全獨立於語言的文本格式,但是也使用了類似於C語言家族的習慣(包括C, C++, C#, Java, JavaScript, Perl, Python等)。這些特性使JSON成爲理想的數據交換語言。易於人閱讀和編寫,同時也易於機器解析和生成。

JSON 官網地址: http://json.org

常用的幾個版本包括C, C++, C#, Java, JavaScript, Perl, Python等

那麼針對cocos2dx 我們應該使用c++的版本~

第一步: 下載cpp版本的json

 

 http://vdisk.weibo.com/s/yZxRoLm4SZZDD (Himi 微盤)

第二步: 解壓文件夾放置項目中即可使用

1
導入頭文件: #include "jsoncpp/include/json/json.h"

第三步:常用示例

3.1   先熟悉幾個類名和函數:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
    /*
     Value:寫過腳本、弱語言的童鞋應該很清楚var,其他Value 和var一個道理,都是可以表示很多數據類型的數據類型,。
         這話可能比較繞,簡單說就是Value你可以理解可以是int 也可以是string 也可以是其他數據類型。
         當然定義 Value value,只是個定義,還沒有決定其數據類型,如果你Value value =10;那麼value 就是個整型
         在用於JSON時,我們常表示爲一個map,其中包括 key-value,鍵值對
 
     其中Value 中包括一些將其轉爲基礎數據類型的6個方法,如下:
         value.asCString();
         value.asString();
         value.asBool();
         value.asDouble();
         value.asInt();
         value.asUInt();
     */
Json::FastWriter write;
    /*
     FastWriter:起作用是將Value數據編碼成JSON格式的數據
     常用函數:write(<#const Json::Value &root#>)
     */
Json::Reader reader;
    /*
     Value:作用與FastWriter相反,是將JSON格式的數據解析成一個Value
     常用函數: reader.parse(<#std::istream &is#>, <#Json::Value &root#>)
     */

以上是常用的類和函數已經註釋說明的很清楚了,那麼下面我們開始進行製作JSON數據、解析JSON數據等操作吧:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
    //創建JSON數據
 
    //------先定義數據
    Json::Value map;
    map["name"]="Himi";
    map["age"]=23;
    //------編碼成json數據
    string jsonData =write.write(map);
    CCLOG("jsonData:%s",jsonData.c_str());
    //打印結果 Cocos2d: jsonData:{"age":23,"name":"Himi"}
 
    //解析JSON數據
    //--先將數據解析到 Value(parseData)中
    Json::Value parseData;
    reader.parse(jsonData, parseData);
 
    Json::Value valueName = "默認";
    Json::Value valueAge = -1;
    valueName = parseData.get("name", valueName);
    valueAge = parseData.get("age", valueAge);
 
    const char* nameStr =valueName.asCString() ;
    int age = valueAge.asInt();
    CCLOG("name:%s,age:%d",nameStr,age);
    //打印結果:Cocos2d: name:Himi,age:23
 
    //使用get函數時,第一個參數是key的名, 第二個參數是如果找不到對應key的默認Value
    //舉例我們將name和age,故意寫錯:
 
//    Json::Value parseData;
//    reader.parse(jsonData, parseData);
//   
//    Json::Value valueName = "默認";
//    Json::Value valueAge = -1;
//    valueName = parseData.get("nameHimi", valueName);
//    valueAge = parseData.get("ageHimi", valueAge);
//   
//    const char* nameStr =valueName.asCString() ;
//    int age = valueAge.asInt();
//    CCLOG("name:%s,age:%d",nameStr,age);
    //打印結果:Cocos2d: name:默認,age:-1
 
    //複雜一點JSON的編寫和解析
    Json::Value root;
    Json::Value array;
    array["arrKey1"]="arrValue1";
    array["arrKey2"]="arrValue2";
    array["arrKey3"]="arrValue3";
    root["arrayKey"] =array;
    string hJsonData = write.write(root);
    CCLOG("複雜一點的JSON格式數據:%s",hJsonData.c_str());
    //打印結果 Cocos2d: 複雜一點的JSON格式數據:{"arrayKey":{"arrKey1":"arrValue1","arrKey2":"arrValue2","arrKey3":"arrValue3"}}
 
    Json::Value parseRoot;
    Json::Value parseArray;
    reader.parse(hJsonData, parseRoot);
    parseArray = parseRoot.get("arrayKey", parseArray);
 
    CCLOG("解析出的數據:%s,%s,%s",
          parseArray.get("arrKey1",NULL).asCString(),
          parseArray.get("arrKey2",NULL).asCString(),
          parseArray.get("arrKey3",NULL).asCString());
    //打印結果:Cocos2d: 解析出的數據:arrValue1,arrValue2,arrValue3

整體來說JSON CPP 還是很非常好用的,就不多扯了~ 再複雜的數據只要會瞭如上,基本就全OK;

需要注意的兩點:

1. 使用Value的get函數時,如果你傳入第二個參數(默認Value),那麼一定要將獲得的結果賦值給第二個參數,防止get函數找到對應Key時,Value沒人要的問題發生。如下:

Json::Value value;

value = xx .get(“key”,value);

當然你很確定key,你也可以:

Value value = xx .get(“key”,NULL);

2.使用get獲取的value,一定要注意其數據類型,不要獲取的是個整型,還要使用asCString()函數轉換。

   下面我們來學習如何添加新字體庫:

步驟一:找一個ttf字體庫

步驟二:找到這個ttf字體庫的真實名稱

打開你的應用 “字體冊”(MAC OS系統下),如下圖操作):

asdf

找到了字體庫真實名稱,那麼修改將其真名作爲爲此新的字體庫名稱即可。

然後將其加入你的項目中即可使用

步驟三:

打開Xcode項目資源下的info.plist文件:

然後右鍵 “Add Row”,添加“Fonts provided by application ”條目,如下圖:

(將新加的字體庫真名加入此條目列表下即可)

QQ20131108-5

剩下,我們書寫測試代碼:

1
2
3
4
5
6
7
8
9
10
//使用系統自帶字體庫
CCLabelTTF* pLabel = CCLabelTTF::create("自帶字體庫", "Thonburi", 50);
CCSize size = CCDirector::sharedDirector()->getWinSize();
pLabel->setPosition( ccp(size.width / 2, size.height*0.5 + 30) );
this->addChild(pLabel, 1);
 
//使用新加的字體庫
CCLabelTTF* pLabelHimi = CCLabelTTF::create("Himi 新加字體庫", "DFKanTingLiuW9.ttf", 50);
pLabelHimi->setPosition( ccp(size.width / 2, size.height*0.5 - 40) );
this->addChild(pLabelHimi, 1);

運行效果圖如下圖所示:

QQ20131108-6

 

需要注意一點: 使用新加的字體庫,那麼創建CCLabelTTF時,傳入的字體名是要有”.ttf”後綴的!

OK,本章就到這裏~ 希望對大家有所幫助! :ku:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章