天天看點

【COCOS2D-X(1.X 2.X)】Json(cpp版)以及添加自定義字型庫教程

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

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

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

首先了JSON相關知識:

1

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

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

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

第一步: 下載下傳cpp版本的json

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

<code>導入頭檔案: </code><code>#include "jsoncpp/include/json/json.h"</code>

第三步:常用示例

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

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

<code></code><code>/*</code>

<code></code><code>Value:寫過腳本、弱語言的童鞋應該很清楚var,其他Value 和var一個道理,都是可以表示很多資料類型的資料類型,。</code>

<code></code><code>這話可能比較繞,簡單說就是Value你可以了解可以是int 也可以是string 也可以是其他資料類型。</code>

<code></code><code>當然定義 Value value,隻是個定義,還沒有決定其資料類型,如果你Value value =10;那麼value 就是個整型</code>

<code></code><code>在用于JSON時,我們常表示為一個map,其中包括 key-value,鍵值對</code>

<code></code><code>其中Value 中包括一些将其轉為基礎資料類型的6個方法,如下:</code>

<code></code><code>value.asCString();</code>

<code></code><code>value.asString();</code>

<code></code><code>value.asBool();</code>

<code></code><code>value.asDouble();</code>

<code></code><code>value.asInt();</code>

<code></code><code>value.asUInt();</code>

<code></code><code>*/</code>

<code>Json::FastWriter write;</code>

<code></code><code>FastWriter:起作用是将Value資料編碼成JSON格式的資料</code>

<code></code><code>常用函數:write(&lt;#const Json::Value &amp;root#&gt;)</code>

<code>Json::Reader reader;</code>

<code></code><code>Value:作用與FastWriter相反,是将JSON格式的資料解析成一個Value</code>

<code></code><code>常用函數: reader.parse(&lt;#std::istream &amp;is#&gt;, &lt;#Json::Value &amp;root#&gt;)</code>

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

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

<code></code><code>//建立JSON資料</code>

<code></code><code>//------先定義資料</code>

<code></code><code>Json::Value map;</code>

<code></code><code>map[</code><code>"name"</code><code>]=</code><code>"Himi"</code><code>;</code>

<code></code><code>map[</code><code>"age"</code><code>]=23;</code>

<code></code><code>//------編碼成json資料</code>

<code></code><code>string jsonData =write.write(map);</code>

<code></code><code>CCLOG(</code><code>"jsonData:%s"</code><code>,jsonData.c_str());</code>

<code></code><code>//列印結果 Cocos2d: jsonData:{"age":23,"name":"Himi"}</code>

<code></code><code>//解析JSON資料</code>

<code></code><code>//--先将資料解析到 Value(parseData)中</code>

<code></code><code>Json::Value parseData;</code>

<code></code><code>reader.parse(jsonData, parseData);</code>

<code></code><code>Json::Value valueName = </code><code>"預設"</code><code>;</code>

<code></code><code>Json::Value valueAge = -1;</code>

<code></code><code>valueName = parseData.get(</code><code>"name"</code><code>, valueName);</code>

<code></code><code>valueAge = parseData.get(</code><code>"age"</code><code>, valueAge);</code>

<code></code><code>const</code><code>char</code><code>* nameStr =valueName.asCString() ;</code>

<code></code><code>int</code><code>age = valueAge.asInt();</code>

<code></code><code>CCLOG(</code><code>"name:%s,age:%d"</code><code>,nameStr,age);</code>

<code></code><code>//列印結果:Cocos2d: name:Himi,age:23</code>

<code></code><code>//使用get函數時,第一個參數是key的名, 第二個參數是如果找不到對應key的預設Value</code>

<code></code><code>//舉例我們将name和age,故意寫錯:</code>

<code>// Json::Value parseData;</code>

<code>// reader.parse(jsonData, parseData);</code>

<code>//</code>

<code>// Json::Value valueName = "預設";</code>

<code>// Json::Value valueAge = -1;</code>

<code>// valueName = parseData.get("nameHimi", valueName);</code>

<code>// valueAge = parseData.get("ageHimi", valueAge);</code>

<code>// const char* nameStr =valueName.asCString() ;</code>

<code>// int age = valueAge.asInt();</code>

<code>// CCLOG("name:%s,age:%d",nameStr,age);</code>

<code></code><code>//列印結果:Cocos2d: name:預設,age:-1</code>

<code></code><code>//複雜一點JSON的編寫和解析</code>

<code></code><code>Json::Value root;</code>

<code></code><code>Json::Value array;</code>

<code></code><code>array[</code><code>"arrKey1"</code><code>]=</code><code>"arrValue1"</code><code>;</code>

<code></code><code>array[</code><code>"arrKey2"</code><code>]=</code><code>"arrValue2"</code><code>;</code>

<code></code><code>array[</code><code>"arrKey3"</code><code>]=</code><code>"arrValue3"</code><code>;</code>

<code></code><code>root[</code><code>"arrayKey"</code><code>] =array;</code>

<code></code><code>string hJsonData = write.write(root);</code>

<code></code><code>CCLOG(</code><code>"複雜一點的JSON格式資料:%s"</code><code>,hJsonData.c_str());</code>

<code></code><code>//列印結果 Cocos2d: 複雜一點的JSON格式資料:{"arrayKey":{"arrKey1":"arrValue1","arrKey2":"arrValue2","arrKey3":"arrValue3"}}</code>

<code></code><code>Json::Value parseRoot;</code>

<code></code><code>Json::Value parseArray;</code>

<code></code><code>reader.parse(hJsonData, parseRoot);</code>

<code></code><code>parseArray = parseRoot.get(</code><code>"arrayKey"</code><code>, parseArray);</code>

<code></code><code>CCLOG(</code><code>"解析出的資料:%s,%s,%s"</code><code>,</code>

<code></code><code>parseArray.get(</code><code>"arrKey1"</code><code>,NULL).asCString(),</code>

<code></code><code>parseArray.get(</code><code>"arrKey2"</code><code>,NULL).asCString(),</code>

<code></code><code>parseArray.get(</code><code>"arrKey3"</code><code>,NULL).asCString());</code>

<code></code><code>//列印結果:Cocos2d: 解析出的資料:arrValue1,arrValue2,arrValue3</code>

整體來說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系統下),如下圖操作):

<a href="http://www.himigame.com/wp-content/uploads/2013/11/asdf.png" target="_blank"></a>

找到了字型庫真實名稱,那麼修改将其真名作為為此新的字型庫名稱即可。

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

步驟三:

打開Xcode項目資源下的info.plist檔案:

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

(将新加的字型庫真名加入此條目清單下即可)

<a href="http://www.himigame.com/wp-content/uploads/2013/11/QQ20131108-5.png" target="_blank"></a>

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

<code>//使用系統自帶字型庫</code>

<code>CCLabelTTF* pLabel = CCLabelTTF::create(</code><code>"自帶字型庫"</code><code>, </code><code>"Thonburi"</code><code>, 50);</code>

<code>CCSize size = CCDirector::sharedDirector()-&gt;getWinSize();</code>

<code>pLabel-&gt;setPosition( ccp(size.width / 2, size.height*0.5 + 30) );</code>

<code>this</code><code>-&gt;addChild(pLabel, 1);</code>

<code>//使用新加的字型庫</code>

<code>CCLabelTTF* pLabelHimi = CCLabelTTF::create(</code><code>"Himi 新加字型庫"</code><code>, </code><code>"DFKanTingLiuW9.ttf"</code><code>, 50);</code>

<code>pLabelHimi-&gt;setPosition( ccp(size.width / 2, size.height*0.5 - 40) );</code>

<code>this</code><code>-&gt;addChild(pLabelHimi, 1);</code>

運作效果圖如下圖所示:

<a href="http://www.himigame.com/wp-content/uploads/2013/11/QQ20131108-6.png" target="_blank"></a>

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

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

本文轉自 xiaominghimi 51CTO部落格,原文連結:http://blog.51cto.com/xiaominghimi/1322253,如需轉載請自行聯系原作者

繼續閱讀