cocos2dX 之數據存儲
今天我們來看cocos2dX裏面的數據存儲類, CCUserDefault, 如今的遊戲基本都會把用戶信息保存下來, 以便於再次進入遊戲的時候讀取, 為了方便起見,有時我們也能夠用CCUserDefault來存儲金幣數目這樣的簡單的數據項, 當然, 大型數據還是建議使用數據庫
閑話不多說, 我們來看看cocos2dX為我們準備了哪些函數:
setBoolForKey( 鍵值, 值); //設置一個bool值
setStringForKey( 鍵值, 值); //設置一個string值
setDoubleForKey( 鍵值, 值); //設置一個double值
setFloatForKey( 鍵值, 值); //設置一個float值
setIntegerForKey( 鍵值, 值); //設置一個int值
getBoolForKey( 鍵值); //讀取一個bool值
getStringForKey( 鍵值); //讀取一個string值
getDoubleForKey( 鍵值);//讀取一個double值
getFloatForKey( 鍵值); //讀取一個float值
getIntegerForKey( 鍵值); //讀取一個int值
getBoolForKey( 鍵值, 默認值); //讀取一個bool值
getStringForKey( 鍵值, 默認值); //讀取一個string值
getDoubleForKey( 鍵值, 默認值);//讀取一個double值
getFloatForKey( 鍵值, 默認值); //讀取一個float值
getIntegerForKey( 鍵值, 默認值); //讀取一個int值
flush(); //保存到文件
話說函數也不是非常多啊, 五種類型, set寫入, get取出, 非常明顯的哈希表結構, Key-Valua, Key索引Value的值,
我們先來來寫寫代碼:
CCLabelTTF* ttf = CCLabelTTF::create( "null", "Arial", 32); ttf->setPosition( ccp( visibleSize.width / 2, visibleSize.height / 2)); addChild( ttf, 0, 101); if ( CCUserDefault::sharedUserDefault()->getBoolForKey( "flag", false)) { //有數據 std::string str = CCUserDefault::sharedUserDefault()->getStringForKey( "str", "null"); //取出string ttf->setString( str.c_str()); //將字符串的標題設為str } else { //沒有數據 CCUserDefault::sharedUserDefault()->setStringForKey( "str", "now, hava data"); //寫入字符串 CCUserDefault::sharedUserDefault()->setBoolForKey( "flag", true); //寫入bool CCUserDefault::sharedUserDefault()->flush(); //將數據存入xml裏面, 只是如今貌似能夠不加也能夠 }
我們來看看第一次執行的效果:
第二次執行:
我們再到項目裏面的Debug.win32以下看看, 是不是多了一個UserDefault.xml
我們打開這個文件看看:
非常熟悉吧, 有兩個數據:
key: str<====>valua:now, hava data
key:flag<====>valua:true
只是CCUserDefault給我們提供的存儲方式是明文存儲, 非常easy被其它人從外部改動, 所以我們存入xml的時候最好是加密存儲, 所以為了防止玩家改動數據, 我們也寫個簡單的加密解密函數:
在頭文件中面定義兩個函數:
void encode(std::string &str); void decode(std::string &str);
實現他們, 這個, 我沒有研究過加密解密算法, 所以就來個最簡單的:
//加密 void HelloWorld::encode(std::string &str) { for(int i = 0; i < str.length(); i++) { int ch = str[i]; ch = ch ^ 1; str[i] = ch; } } //解密 void HelloWorld::decode(std::string &str) { for(int i = 0; i < str.length(); i++) { int ch = str[i]; ch = ch ^ 1; str[i] = ch; } }
使用一下, 看看效果先:
( 旁白: 感覺怎麽沒有區別呢? 又忽悠我們?), 別急嘛, 我們看看XML文件:
看看, 你能看懂嗎?
好了, 今天就到這裏, 我發現近期的東西會不會是越來越簡單了啊, 過段時間給來點有難度的
cocos2dX 之數據存儲