本站文章均為[?李華明Himi?](http://www.himigame.com/about-himi)原創,轉載務必在明顯處注明:
轉載自[【黑米GameDev街區】](http://www.himigame.com/)?原文鏈接:?[http://www.himigame.com/iphone-cocos2dx/659.html](http://www.himigame.com/iphone-cocos2dx/659.html "【iOS-cocos2d-X")
上一篇介紹了,如何使用Cocos2dX自帶的CCUserDefault 存儲游戲數據,那么Himi也提到此方式保存的為xml格式并且數據明文顯示=。 =,這個對于我們開發者來說太暴漏了有木有! so~本篇Himi分享如何使用經典Base64算法對CCUserDefault進行數據編碼!
OK,關于base64的介紹,Himi不再贅述,還不太熟悉的童鞋請點擊以下連接閱讀:
[http://baike.baidu.com/view/469071.htm](http://baike.baidu.com/view/469071.htm)?(百度百科的 base64詳細解釋)
如果對于Cocos2dX自帶的CCUserDefault類不太熟悉的請點擊如下連接:
[【iOS-cocos2d-X 游戲開發之五】游戲存儲之Cocos2dX自帶CCUserDefault類詳解;](http://www.himigame.com/iphone-cocos2dx/653.html)
對Base64有了基礎認識后我們就開始進入正題,首先,我們針對Cocos2dX使用c++版的base64編碼文件:
base64.h以及base64.cpp ?文件下載導入項目中:
[DataBase64Himi.zip](http://www.himigame.com/?dl_id=63)?(647 字節, 11 次)
然后Himi封裝好了兩個函數:(這里我們假設存儲游戲金幣)
首先.h中,定義枚舉變量(備注1)
~~~
enum{
DATA_GOLD,//金幣
};
~~~
然后.h定義兩個函數:(備注2)
~~~
//存儲數據
void saveDataByKeyValue(int iKey, string sValue);
//讀取數據
int loadDataByKey(int iKey);
~~~
最后.cpp中函數具體實現代碼:(備注3)
~~~
//存儲
void HelloWorld::saveDataByKeyValue(int iKey, string sValue){
char buffer[32];
sprintf(buffer, "%s%d", "Himi",iKey);
CCLog("----------存儲");
CCLog("存儲之前數據 key:index: Himi%i, value: %s ",iKey,sValue.c_str());
string sKey = himiSaveData(reinterpret_cast<const unsigned char*>(sValue.c_str()), sValue.length());
CCLog("存儲編碼后的數據 key:index: Himi%i, value: %s ",iKey,sKey.c_str());
CCUserDefault::sharedUserDefault()->setStringForKey(buffer, sKey);
CCUserDefault::sharedUserDefault()->flush();
}
//讀取
int HelloWorld::loadDataByKey(int iKey){
CCLog("----------讀取");
char buffer[32];
sprintf(buffer, "%s%d", "Himi",iKey);
string s = CCUserDefault::sharedUserDefault()->getStringForKey(buffer);
CCLog("解碼前的數據: %s ",s.c_str());
string parseKey = himiParseData(s);
CCLog("解碼后的數據: %s ",parseKey.c_str());
return atoi(parseKey.c_str());
}
~~~
OK,這里開始逐步解釋一下:
首先說下備注2,這里定義的兩個方法,第一個函數:
~~~
//存儲數據
void saveDataByKeyValue(int iKey, string sValue);
~~~
其中第一個函數傳入一個int值,為什么要這樣,原因是這樣方便與結合枚舉變量(備注1)來進行存儲,這樣使用的時候非常簡化你的代碼和步驟;第二個函數是值,這里我封裝成string,這樣為了更好的結合我們的base64編碼!這點在(備注3)中體現!
第二個函數:
~~~
//讀取數據
int loadDataByKey(int iKey);
~~~
這個函數沒什么好說的,傳入的參數int,枚舉變量即可!至于返回值是int 是方便程序中使用!
OK,那么備注3對于兩個封裝函數中的實現需要說明的有3點:
1.將傳入的int值(key)轉化成char*類型,因為cocos2dx中并沒有itoa這樣的方法(原因上一篇有介紹),所以這里我采用 ??char buffer[32]; ? ?sprintf(buffer, “%s%d”, “Himi”,iKey); ?方式進行將int轉化char*類型;
2.存儲的時候我們步驟是:string值進行base64編碼,然后存儲到xml中;
3.將int轉化string的時候我在枚舉變量前加入”Himi”,大家不喜歡可以換成自己喜歡的,但是千萬不要刪除!因為一旦你刪除掉,然后將存儲后的形式為: <1>數據</1> ?這樣會造成你讀取數據出錯!
讀取數據步驟:根據key讀取xml的編碼過的string,然后base64解碼出原始值,最終atoi轉化成int扔出!
這其中應該說沒什么難于理解的,所以這里不再贅述了;
那么下面我們來看這兩個函數如何使用:
~~~
//base64編碼存儲
this->saveDataByKeyValue(DATA_GOLD, "10000");
//base64讀取數據
this->loadDataByKey(DATA_GOLD);
~~~
代碼是不是用起來很方面呢!哈哈,這就對啦,不能因為編碼弄得亂78糟~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: 此項目已存在保存數據的xml文件
Cocos2d: 存儲之前數據 key:index: 0, value: 10000
Cocos2d: 存儲編碼后的數據 key:index: 0, value: MTAwMDA=
Cocos2d: 解碼前的數據: MTAwMDA=
Cocos2d: 解碼后的數據: 10000
~~~
存儲的文件內容截圖如下:
[](http://www.himigame.com/wp-content/uploads/2012/03/1232.png)
OK,最后呢,我要說一點,雖然我們使用base64可以對數據進行編碼,但是對于不懂程序的用戶來說基本無法修改,但是對于稍微有了解base64編碼的童鞋,那么直接可以在線解碼你的這個編碼,所以呢!最后Himi提醒大家,使用base64當中,大家可以書寫一些算法結合base64來使用!這樣即使明文也不怕,至于怎么做,Himi就不再多說了 哈哈!
本篇源碼下載:
[base64SaveDataForCocos2dx.zip](http://www.himigame.com/?dl_id=64)(691 字節, 6 次)
- 前言
- 【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工具的&quot;.pvr.ccz&quot;,&quot;.plist&quot;共用的終極精靈優化及注意事項!
- 【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日更新獲取&quot;產品付費數量等于0的問題&quot;】
- 【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編寫&amp;編譯代碼,Android導入打包運行即可!
- 【iOS-iap防護】驗證用戶付費收據!拒絕iap Cracker!拒絕iap Free!讓iphone越獄用戶無從下手!【2012年5月2日更新防護iap Free的方法】
- 【COCOS2DX-LUA 腳本開發之一】在Cocos2dX游戲中使用Lua腳本進行游戲開發(基礎篇)并介紹腳本在游戲中詳細用途!
- 【iOS-cocos2d-X 游戲開發之九】Cocos2dx利用CCSAXParser解析xml數據&amp;CCMutableDictionary使用與注意!
- 【iOS-cocos2d-X 游戲開發之十】自定義CCSprite/Layer/CCNode及靜態類模版&amp;自定義類細節說明&amp;Cocos2dx觸屏事件講解
- 【iOS-cocos2d-X 游戲開發之十一】New CCSprite()帶來的錯誤&amp;使用CCUserDefault及pvr.ccz在Cocos2dx中要注意!
- 【iOS-cocos2d-X 游戲開發之十二】自定義Cocos2dx搖桿(增強Joystick),增加搖桿跟隨用戶觸點作為搖桿坐標,讓搖桿不再死板!
- 【iOS-cocos2d-X 游戲開發之十三】詳細講解在Xcode中利用預編譯并通過Jni調用Android的Java層代碼(cocos2dx里訪問調用Android函數)!
- 【iOS-cocos2d-X 游戲開發之十四】Xcode中c++&amp;Object-C混編,詳細介紹如何在cocos2dx中訪問object函數以及Apple Api
- 【iOS-cocos2d-X 游戲開發之十五】Cocos2dx中響應Android的Back(返回)與Menu(小房子)事件&amp;&amp;Cocos2dx自動釋放粒子內存函數!
- 【iOS-cocos2d-X 游戲開發之十六】配置你的Cocos2dx項目編譯后的Android自動使用(-hd)高清圖&amp;設置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編寫&amp;編譯代碼,Android導入打包運行即可!
- 【Cocos2dX(2.x)_Lua開發之三】★重要必看篇★在Lua中使用自定義精靈(Lua腳本與自創建類之間的訪問)及Lua基礎講解
- 【Cocos2d-X(2.x) 游戲開發系列之三】最新版本cocos2d&#173;2.0&#173;x&#173;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)