本站文章均為[?李華明Himi?](http://www.himigame.com/about-himi)原創,轉載務必在明顯處注明:
轉載自[【黑米GameDev街區】](http://www.himigame.com/)?原文鏈接:?[http://www.himigame.com/iphone-cocos2dx/653.html](http://www.himigame.com/iphone-cocos2dx/653.html "【iOS-cocos2d-X")
本篇跟大家分享下Cocos2dX中的存儲,其中也介紹些細節容易犯錯的問題;
在Cocos2dX中提供了自帶存儲類:CCUserDefault ?,當然了這里Himi強調一點,如果你的數據量比較大,建議使用SQL存儲比較適合,另外一點要注意的是,盡可能不要在Cocos2dX中使用與平臺相關的api進行開發,例如Xcode使用Cocos2dX進行開發游戲時不小心使用了iOS的控件/組件在項目中,那么當移植到Android等平臺的時候就肯定異常費勁,估計連正常運行都不可能,因為其他平臺不可能正好有iOS的這些控件,即使有也肯定底層實現不一樣!換句話而言,神馬功能都使用Cocos2dX api實現,盡量都向X靠攏吧,所以這里的存儲我也使用X自帶的CCUserDefault;至少使用Cocos2dX自帶的對于跨平臺這一塊肯定支持的比較好啦;
言歸正傳,先大致介紹一下這個類的API:
~~~
Public Member Functions
~CCUserDefault ()
bool getBoolForKey (const char *pKey, bool defaultValue=false)
Get bool value by key, if the key doesn't exist, a default value will return.
int getIntegerForKey (const char *pKey, int defaultValue=0)
Get integer value by key, if the key doesn't exist, a default value will return.
float getFloatForKey (const char *pKey, float defaultValue=0.0f)
Get float value by key, if the key doesn't exist, a default value will return.
double getDoubleForKey (const char *pKey, double defaultValue=0.0)
Get double value by key, if the key doesn't exist, a default value will return.
std::string getStringForKey (const char *pKey, const std::string &defaultValue="")
Get string value by key, if the key doesn't exist, a default value will return.
void setBoolForKey (const char *pKey, bool value)
Set bool value by key.
void setIntegerForKey (const char *pKey, int value)
Set integer value by key.
void setFloatForKey (const char *pKey, float value)
Set float value by key.
void setDoubleForKey (const char *pKey, double value)
Set double value by key.
void setStringForKey (const char *pKey, const std::string &value)
Set string value by key.
void flush ()
Save content to xml file.
Static Public Member Functions
static CCUserDefault * sharedUserDefault ()
static void purgeSharedUserDefault ()
static const std::string & getXMLFilePath ()
~~~
從以上可以一目了然CCUserDefault的使用和功能,哈希表結構,Key -Value,key索引Value值;
提供的存儲都是些基礎類型,bool,int,string,double,float,方法很容易懂:存儲使用set ,獲取使用get ? !
那么最后static方法中可以看到CCUserDefault類留出了一個sharedUserDefault作為接口供開發者使用,那么大概介紹后,下面我們來寫幾段代碼驗證下:
~~~
//我們這里簡單存儲條數據
CCUserDefault::sharedUserDefault()->setStringForKey("key", "himi");
CCUserDefault::sharedUserDefault()->flush();//這里一定要提交寫入哦,否則不會記錄到xml中,下次啟動游戲你就獲取不到value了。
//這里隨便定義一個string為了驗證我們的存儲
string str= "wahaha";
//取出我們剛存儲的himi,然后賦值給str驗證下;
str= CCUserDefault::sharedUserDefault()->getStringForKey("key");
CCLog("打印str=:%s",str.c_str());
~~~
這里要注意, ? ?CCUserDefault中有個 ?flush()的函數,這個用來將數據寫入xml文件中,也就是說當你使用setXX的一些函數后記得提交(調用一下flush函數)
OK,下面是控制臺輸入的結果:
~~~
Cocos2d: cocos2d: cocos2d-1.0.1-x-0.12.0
Cocos2d: cocos2d: GL_VENDOR: Imagination Technologies
Cocos2d: cocos2d: GL_RENDERER: PowerVR SGX 543
Cocos2d: cocos2d: GL_VERSION: OpenGL ES-CM 1.1 IMGSGX543-63.14.2
Cocos2d: cocos2d: GL_MAX_TEXTURE_SIZE: 4096
Cocos2d: cocos2d: GL_MAX_MODELVIEW_STACK_DEPTH: 16
Cocos2d: cocos2d: GL supports PVRTC: YES
Cocos2d: cocos2d: GL supports BGRA8888 textures: NO
Cocos2d: cocos2d: GL supports NPOT textures: YES
Cocos2d: cocos2d: GL supports discard_framebuffer: YES
Cocos2d: cocos2d: compiled with NPOT support: NO
Cocos2d: cocos2d: compiled with VBO support in TextureAtlas : NO
Cocos2d: 打印str=:himi
~~~
最后一句驗證了我們的存儲沒問題,那么我們現在驗證是否真的存在xml中了,首先停止當前運行的項目,然后刪除剛才代碼替換如下代碼:
~~~
CCLog("打印str=:%s",CCUserDefault::sharedUserDefault()->getStringForKey("key").c_str());
~~~
然后重新運行此項目,觀察控制臺打印如下:
~~~
Cocos2d: cocos2d: cocos2d-1.0.1-x-0.12.0
Cocos2d: cocos2d: GL_VENDOR: Imagination Technologies
Cocos2d: cocos2d: GL_RENDERER: PowerVR SGX 543
Cocos2d: cocos2d: GL_VERSION: OpenGL ES-CM 1.1 IMGSGX543-63.14.2
Cocos2d: cocos2d: GL_MAX_TEXTURE_SIZE: 4096
Cocos2d: cocos2d: GL_MAX_MODELVIEW_STACK_DEPTH: 16
Cocos2d: cocos2d: GL supports PVRTC: YES
Cocos2d: cocos2d: GL supports BGRA8888 textures: NO
Cocos2d: cocos2d: GL supports NPOT textures: YES
Cocos2d: cocos2d: GL supports discard_framebuffer: YES
Cocos2d: cocos2d: compiled with NPOT support: NO
Cocos2d: cocos2d: compiled with VBO support in TextureAtlas : NO
Cocos2d: 打印str=:himi
~~~
通過剛才的key->”key”,正常獲取到“himi”這個字符串了,OK,監測沒問題;
那么一般情況下我們會需要一個方法就是判定當前項目是否已經有存儲數據的xml文件存在了,那么Himi這里說下,Cocos2dX默認源碼中有這個方法,但是并沒有提供給開發者使用,因為此函數被private私有了,此函數源碼如下圖所示:
[](http://www.himigame.com/wp-content/uploads/2012/03/1111.png)? ? ? ?那么既然如此Himi這里就自定義了一個檢測是否已存在數據xml的函數提供大家使用:(提醒:很多童鞋該說啦,為什么不直接修改源碼將其public呢?!其實Himi也這么想,但是如果你后期使用了新的Cocos2dX的版本,或者同事機器的Cocos2dX并沒有這么修改源碼都會產生錯誤,反過來說,既然能很容易的寫出一個判斷的方法何必去動它呢,不是么?哈哈!)
~~~
.h文件:
bool isHaveSaveFile();
.cpp文件:
//當前項目是否存在存儲的xml文件
bool HelloWorld::isHaveSaveFile(){
if(!CCUserDefault::sharedUserDefault()->getBoolForKey("isHaveSaveFileXml"))
{
CCUserDefault::sharedUserDefault()->setBoolForKey("isHaveSaveFileXml", true);
CCUserDefault::sharedUserDefault()->flush();//提交
// CCLog("存儲文件不存在,頭次開始加載游戲");
return false;
}else{
// CCLog("存儲文件已存在");
return true;
}
}
~~~
備注:當存儲數據的xml不存在的時候,你的第一次存儲數據的時候默認會創建,路徑在你的app下的documents,如下圖所示:
[](http://www.himigame.com/wp-content/uploads/2012/03/22221.png)
那么這里Himi強調一點!大家要注意setXX的函數的參數,例如以下這個函數:
setStringForKey (const char *pKey, const std::string &value)
第一個參數是const char*類型,不是string!!!!(Himi因為這個原因浪費不少時間,悲劇阿。)
Himi當時存儲寫了如下代碼,造成錯誤,如下:
~~~
CCUserDefault::sharedUserDefault()->setStringForKey(""+823, sKey);
~~~
錯誤截圖如下:(存儲的key變成了路徑。。。。《數據是Himi加密后的》)
[](http://www.himigame.com/wp-content/uploads/2012/03/error.png)
哎,郁悶,這里Himi犯錯希望童鞋們不要再范此錯誤,之前Himi一直想找 itoa 找個函數,但是怎么都找不到!(c++ ?應該存在的整形轉字符串),但是Cocos2dX中沒有,并且最后Himi使用了與Cocos2dX引擎中的實現itoa的源碼,發現如下:
[](http://www.himigame.com/wp-content/uploads/2012/03/33333.png)
Cocos2dX自帶的這個CCUserDefault并不是加密的,而是明文并且是.xml格式的,所以后續Himi準備寫一篇使用base64來進行加密的文章供大家參考;
本篇源碼下載:
[SaveDataForCocos2dx.zip](http://www.himigame.com/?dl_id=62)?(667 字節, 1 次)
?
- 前言
- 【Iphone 游戲開發】游戲引擎剖析
- [Object-C語言隨筆之一]Mac os 下搭建iOS開發環境
- [Object-C語言隨筆之二] 《NSLog》常用的打印調試語句與自動排版
- [Object-C語言隨筆之三] 類的創建和實例化以及函數的添加和調用!
- [Object-C語言隨筆之四]創建視圖并繪制簡單圖形
- 【iOS-Cocos2d游戲開發之一】搭建cocos2d游戲引擎環境HelloWorld!
- 【iOS-Cocos2d游戲開發之二】Cocos2D 游戲開發資源貼(教程以及源碼)
- 【iOS-Cocos2d游戲開發之三】CCScene切換的所有特效(28種)以及設置屏幕橫豎屏!
- 【iOS-Cocos2d游戲開發之四】獨自收集Cocos2d提供的字體!共57種(有對照的字體圖)
- 【iOS-Cocos2d游戲開發之五】多觸點與觸屏事件詳解(單一監聽、事件分發)【11月28日更新】
- 【iOS-Cocos2d游戲開發之六】對觸屏事件追加講解,解決無法觸發ccTouchMoved事件[重要!]
- 【iOS-Cocos2d游戲開發之七】在cocos2d中添加/刪除系統組件,并解決View設置透明會影響View中的其他組件的問題!【11月28日更新解決添加組件Cocos2d動畫停止播放的BUG】
- 【iOS-Cocos2d游戲開發之八】開啟高清(960*640)模式問題與解答、圖片適配以及設置iphone橫豎屏
- 【iOS-Cocos2d游戲開發之九】講解CCSpriteBatchNode與TP工具的".pvr.ccz",".plist"共用的終極精靈優化及注意事項!
- 【iOS-Cocos2d游戲開發之十】添加粒子系統特效并解決粒子特效與Layer之間的坐標問題;
- 【iOS-Cocos2d游戲開發之十一】使用Box2d物理系統以及在cocos2d框架添加Box2d物理系統lib包的方法
- 【iOS-Cocos2d游戲開發之十二】淺析使用C++/C/OC進行iOS游戲混編出現“failed with exit”問題與小結;
- 【iOS-Cocos2d游戲開發之十三】CCSprite利用Bezier(貝塞爾)做拋物線動作并讓CCSprite同時播放兩個Action動作!
- 【iOS-Cocos2d游戲開發之十四】音頻/音效/視頻播放(利用Cocos2D-iPhone-Extensions嵌入Cocos2d進行視頻播放!)
- 【iOS-Cocos2d游戲開發之十五】詳解CCProgressTimer 進度條并修改cocos2d源碼實現“理想”游戲進度條!
- 【iOS-Cocos2d游戲開發之十六】添加本地通知(UILocalNotification)以及添加系統組件滾動視圖(UIScrollView)!【2011年11月15日更新】
- 【iOS-Cocos2d游戲開發之十七】靈活使用精靈可視區域(TextureRect)與錨點(anchorPoint),并結合可視區域與錨點制作進度條!
- 【iOS開發必備指南合集】申請企業級IDP、真機調試、游戲接入GameCenter 指南(實現仿官方的成就提示)、游戲接入OpenFeint指南;
- 【iOS-Cocos2d游戲開發之十八】解決滾屏背景/拼接地圖有黑邊(縫隙)/動畫播放出現毛邊以及禁止游戲中自動鎖屏問題!【2011年12月18日補充】
- 【iOS開發必收藏】詳解iOS應用程序內使用IAP/StoreKit付費、沙盒(SandBox)測試、創建測試賬號流程!【2012-12-11日更新獲取"產品付費數量等于0的問題"】
- 【iOS-cocos2d-X 游戲開發之一】在Mac下結合Xcode搭建Cocos2d-X開發環境!
- 【iOS-cocos2d-X 游戲開發之二】【必看篇】總結闡述Cocos2d-X與Cocos2d-iphone區別;
- 【iOS-Cocos2d游戲開發之十九】游戲數據存儲的四種常用方式NSKeyedArchiver/NSUserDefaults/Write寫入/SQLite3
- 【iOS-Cocos2d游戲開發之二十】精靈的基礎知識點總匯(位圖操作/貼圖更換/重排z軸等)以及利用CCSprite與CCLayerColor制作簡單遮蓋層!
- 【iOS-Cocos2d游戲開發之二十一 】自定義精靈類并為你的精靈設置攻擊幀(指定開始幀)以及擴展Cocos2d源碼的CCAnimation簡化動畫創建!
- 【iOS-Cocos2d游戲開發之二十二 】CCSpeed實現CCAnimate動畫進行時設置慢動作以及設置游戲加減速進行(塔防游戲必備)!
- 【iOS-cocos2d-X 游戲開發之三】Mac下配置Android NDK環境并搭建Cocos2d-x環境并Eclipse正常編譯運行Cocos2dX自帶TestsDemo項目!
- 【iOS-cocos2d-X 游戲開發之四】Cocos2dX創建Android NDK新項目并編譯導入Eclipse中正常運行!
- 【iOS-cocos2d-X 游戲開發之五】游戲存儲之Cocos2dX自帶CCUserDefault類詳解;
- 【iOS-cocos2d-X 游戲開發之六】使用Base64算法對Cocos2dX自帶CCUserDefault游戲存儲數據編碼!
- 【iOS-cocos2d-X 游戲開發之七】整合Cocos2dX的Android項目到Xcode項目中,Xcode編寫&編譯代碼,Android導入打包運行即可!
- 【iOS-iap防護】驗證用戶付費收據!拒絕iap Cracker!拒絕iap Free!讓iphone越獄用戶無從下手!【2012年5月2日更新防護iap Free的方法】
- 【COCOS2DX-LUA 腳本開發之一】在Cocos2dX游戲中使用Lua腳本進行游戲開發(基礎篇)并介紹腳本在游戲中詳細用途!
- 【iOS-cocos2d-X 游戲開發之九】Cocos2dx利用CCSAXParser解析xml數據&CCMutableDictionary使用與注意!
- 【iOS-cocos2d-X 游戲開發之十】自定義CCSprite/Layer/CCNode及靜態類模版&自定義類細節說明&Cocos2dx觸屏事件講解
- 【iOS-cocos2d-X 游戲開發之十一】New CCSprite()帶來的錯誤&使用CCUserDefault及pvr.ccz在Cocos2dx中要注意!
- 【iOS-cocos2d-X 游戲開發之十二】自定義Cocos2dx搖桿(增強Joystick),增加搖桿跟隨用戶觸點作為搖桿坐標,讓搖桿不再死板!
- 【iOS-cocos2d-X 游戲開發之十三】詳細講解在Xcode中利用預編譯并通過Jni調用Android的Java層代碼(cocos2dx里訪問調用Android函數)!
- 【iOS-cocos2d-X 游戲開發之十四】Xcode中c++&Object-C混編,詳細介紹如何在cocos2dx中訪問object函數以及Apple Api
- 【iOS-cocos2d-X 游戲開發之十五】Cocos2dx中響應Android的Back(返回)與Menu(小房子)事件&&Cocos2dx自動釋放粒子內存函數!
- 【iOS-cocos2d-X 游戲開發之十六】配置你的Cocos2dx項目編譯后的Android自動使用(-hd)高清圖&設置Android自適應屏幕、縮放比例方法!
- 【Cocoa(mac) Application 開發系列之四】動作編輯器(Cocos2dx)制作流程詳解及附上響應鼠標滾軸事件、反轉坐標系、導入/創建資源目錄等知識點代碼!
- 【Cocos2d-X(2.x) 游戲開發系列之一】cocos2dx(v2.x)與(v1.x)的一些常用函數區別講解!在2.x版CCFileData類被去除等
- 【Cocos2d-X(2.x) 游戲開發系列之二】cocos2dx最新2.0.1版本跨平臺整合NDK+Xcode,Xcode編寫&編譯代碼,Android導入打包運行即可!
- 【Cocos2dX(2.x)_Lua開發之三】★重要必看篇★在Lua中使用自定義精靈(Lua腳本與自創建類之間的訪問)及Lua基礎講解
- 【Cocos2d-X(2.x) 游戲開發系列之三】最新版本cocos2d­2.0­x­2.0.2使用新資源加載策略!不再沿用-hd、-ipad、-ipadhd添加后綴方式
- 【Cocos2d-X(1.x 2.x) 修復篇】iOS6 中 libcurl.a 無法通過armv7s編譯以及iOS6中無法正常游戲橫屏的解決方法
- 【Cocos2d-X(1.x 2.x) 】iOS6與iphone5適相關設置隨筆(解決第三方類庫無法通過armv7s編譯的方法、添加Default-568h@2x.png)