1. 程式人生 > >cocos2dX 之數據存儲

cocos2dX 之數據存儲

金幣 能夠 cpp 存儲 red 發現 eas hello false

今天我們來看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 之數據存儲