1. 程式人生 > >資料/配置 的儲存方式 Json篇 以Cocos2D For Iphone+TouchJson為例

資料/配置 的儲存方式 Json篇 以Cocos2D For Iphone+TouchJson為例

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

write by 九天雁翎(JTianLing) -- blog.csdn.net/vagrxie

討論新聞組及檔案

前言

配置的好處,JSon介紹,及為什麼要使用Json都參看原來JsonCpp篇

的內容。本文僅針對TouchJson稍微進行一些講解。

 

Cocos2D For IPhone + TouchJson

    Cocos2D For IPhone是我見過的開源2D引擎中特性最完備的一個,即使速度上不算最快的。因為其只支援IPhone平臺,所以能夠在這個平臺上做的很出眾,現在新版的Cocos2D For IPhone已經支援iOS4和IPhone4,其工程模板的安裝使用也是非常方便。新版甚至將原來的LGPL協議改為現在的MIT協議了,使用更加靈活自由。。。。
    TouchJson的使用屬於不想在一個比較完全的Objective C環境中新增C++程式碼,(事實上使用Box2D的話還是避免不了)所以不使用JsonCpp來配合Cocos2D,何況Cocos2D的模板工程中本來就帶有TouchJson了,將其刪掉再插進JsonCpp也太不人道了。。。。呵呵。另外,因為TouchJson用Objective C完成,解析後也是個NSDictionary的物件所以與Objecitve C的物件組合使用會更加自然一些,使用蘋果併為蘋果開發,我是幾乎已經習慣一整套都是用apple平臺專有的東西了,唉。。。。對比當年簡單的因為C#完全掌握在MS手中而不想學習,這也算是一種悲哀,因為Objective C比C#更加封閉,而且,起碼C#還是這個世界上語法最漂亮,最先進語言的代表。

首先,利用Cocos2D的模板,建立一個新的工程,此時預設的效果是顯示一個Hello World。如下:


這裡,我們就不用其他圖了,看看怎麼配置這個Hello World。

最最基礎的流程:
建立一個Json檔案,僅僅有兩行配置,一行表示顯示的文字,一行表示文字的旋轉
{
   "text"  : "Don't Hello World",
    "rotation" : 20
}
然後將此Json檔案放入工程的Resources目錄,我這裡命名為picture.json。

然後可以開始著手解析這個Json檔案了。
整個解析過程又分幾步,首先,#import "CJSONDeserializer.h"
然後,獲取到編譯打包後在Resources目錄檔案的位置:
NSString *path  = [[NSBundle mainBundle]pathForResource:@"picture" ofType:@"json"];

獲取檔案路徑後,從檔案中讀取資料:
NSData *jsonData = [[NSFileManager defaultManager] contentsAtPath:path];

獲取檔案資料後,解析Json檔案:
// Parse JSON results with TouchJSON.  It converts it into a dictionary.
CJSONDeserializer *jsonDeserializer = [CJSONDeserializer deserializer];
NSError *error = nil;
NSDictionary *jsonDict = [jsonDeserializer deserializeAsDictionary:jsonData error:&error];
if (error) {
//handle Error, didn't have here.
}


此時jsonDict儲存的就是解析後的Json資料了。
(以上程式碼都新增在HelloWorldScene的init中)

下面來看使用:
首先,text改變HelloWorld顯示的文字:
    NSString *text = [jsonDict valueForKey:@"text"];
        // create and initialize a Label
        CCLabel* label = [CCLabel labelWithString:text fontName:@"Marker Felt" fontSize:64];
這裡就已經是cocoa中NSDictionary怎麼使用的問題了。

然後,rotation改變旋轉:
    NSNumber *rotation = [jsonDict valueForKey:@"rotation"];
    NSAssert(rotation, @"Didn't have a key named rotation");
    label.rotation = [rotation floatValue];

一切就緒,看效果:


上面的流程已經基本完整了,作為補充,還是新增一個Json陣列使用的例子。
在TouchJson中,作者不推薦將根物件設定為陣列(參見這裡,TouchJson的作者自己說的),事實上也就不那麼做就好了。我們隨便用一個key來指定這個陣列即可。
所以,定義Json檔案如下:

{
   "result" :
   [
     {
       "text"  : "Don't Hello World",

       "rotation" : 20

     },
     {
       "text"  : "Just Hello World",
       "rotation" : -20
     }
   ]
}

然後,讀取的時候還是先讀取出一個NSDictionary物件,但是我們隨後從中取出陣列:
NSArray *dictArray = [jsonDict valueForKey:@"result"];

然後再遍歷陣列,此時陣列中的每個物件又是NSDictionary物件

for (NSDictionary *dict in dictArray) {}

此時獲取到NSDictionary的物件就與原來的字典物件很像了,直接通過valueForKey取對應的配置使用即可。較完整的迴圈程式碼如下:

     for (NSDictionary *dict in dictArray) {
       NSString *text = [dict valueForKey:@"text"];
       // create and initialize a Label
       CCLabel* label = [CCLabel labelWithString:text fontName:@"Marker Felt" fontSize:64];
       
       NSNumber *rotation = [dict valueForKey:@"rotation"];
       NSAssert(rotation, @"Didn't have a key named rotation");
       label.rotation = [rotation floatValue];
       
       // ask director the the window size
       CGSize size = [[CCDirector sharedDirector] winSize];
       
       // position the label on the center of the screen
       label.position =  ccp( size.width /2 , size.height/2 );
       
       // add the label as a child to this Layer
       [self addChild: label];
     }
此時可以看到同時顯示多個文字的效果:


小結:
在使用了JsonCpp和TouchJson後,可以發現由於Json的資料結構主要就是一個Key:Value的對映加陣列,所以無論在C++中還是在Objective C中,總是能用語言的原生結構很好的表示,(在C++中是map,在Objective C中是NSDictionary和NSArray)所以使用會非常方便,對比XML的強大並且複雜,簡單的Json在保持概念非常簡單的情況下完成了配置任務。

 

 

 

 

 

原創文章作者保留版權 轉載請註明原作者 並給出連結

write by 九天雁翎(JTianLing) -- blog.csdn.net/vagrxie










           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述