程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> cocos2d-x學習筆記16:記錄存儲1:CCUserDefault

cocos2d-x學習筆記16:記錄存儲1:CCUserDefault

編輯:關於C語言

 cocos2d-x學習筆記16:記錄存儲1:CCUserDefault


一、簡述 CCUserDefalt作為NSUserDefalt類的cocos2d-x實現版本,承擔了cocos2d-x引擎的記錄實現功能。
他的接口非常簡單。
  1. bool    getBoolForKey (const char *pKey, bool defaultValue=false) 
  2.     //Get bool value by key, if the key doesn't exist, a default value will return.  
  3. int     getIntegerForKey (const char *pKey, int defaultValue=0) 
  4.     //Get integer value by key, if the key doesn't exist, a default value will return.  
  5. float   getFloatForKey (const char *pKey, float defaultValue=0.0f) 
  6.     //Get float value by key, if the key doesn't exist, a default value will return.  
  7. double  getDoubleForKey (const char *pKey, double defaultValue=0.0) 
  8.     //Get double value by key, if the key doesn't exist, a default value will return.  
  9. std::string     getStringForKey (const char *pKey, const std::string &defaultValue="") 
  10.     //Get string value by key, if the key doesn't exist, a default value will return.  
  11. void    setBoolForKey (const char *pKey, bool value) 
  12.     //Set bool value by key.  
  13. void    setIntegerForKey (const char *pKey, int value) 
  14.     //Set integer value by key.  
  15. void    setFloatForKey (const char *pKey, float value) 
  16.     //Set float value by key.  
  17. void    setDoubleForKey (const char *pKey, double value) 
  18.     //Set double value by key.  
  19. void    setStringForKey (const char *pKey, const std::string &value) 
  20.     //Set string value by key.  

在helloworld中增加如下代碼:
  1. CCUserDefault *save=CCUserDefault::sharedUserDefault(); 
  2. save->setBoolForKey("bool_value",true); 
  3. save->setDoubleForKey("double_value",0.1); 
  4. save->setFloatForKey("float_value",0.1f); 
  5. save->setIntegerForKey("integer_value",1); 
  6. save->setStringForKey("string_value","test"); 

然後寫入存檔就完成了。   讀取也很簡單,用對應的get函數即可。但是,我不建議你使用get函數的缺省返回值,尤其是在沒有生成存檔的時候。
二、CCUserDefalt的問題 1.沒有記錄和表的概念 你會發現,如果要設置多存檔,必須自己操作,而且代碼會變得復雜,容易出錯。 對於簡單的游戲可以使用CCUserDefalt,但是對於復雜游戲,可以考慮使用SQLite。
2.沒有數據類型安全 比如,如果你錯寫把一個Integer按Bool讀取,是沒有錯誤提示的
3.沒有存檔數據完整性的校驗 我們找到之前的存檔記錄,用CCUserDefault::getXMLFilePath()可以獲得存檔位置,打開它

可以看到存檔是明文的xml,如果玩家篡改了數據,你無從知曉。這個可以自己增加一個校驗,比如crc,哈希之類的。
三、存檔和游戲初始化的建議流程
一個建議的流程是:
  1. if(!檔案不存在) 
  2.      使用缺省數據寫入存檔; 
  3. 讀取存檔並初始化數據; 

這是我在開發時使用的,在沒有存檔時首先寫入一個,然後再讀取。這減小了編碼量,保證主要流程清晰。
那麼如何判斷存檔不存在呢?我之前想用標准c++的fstream函數,但是如果從CCUserDefalt中用getXMLFilePath獲得存檔路徑的話。如果此時存檔文件不存在,就會自動生成一個。所以接下來的判斷存檔是否存在代碼就會失效了。
yanghuiliu的blog中提到了一個方法,我其實不建議使用這種缺省返回值的方式,但是cocos2dx就設計成這樣了,所以可以使用這種方法。

  1. CCUserDefault *save=CCUserDefault::sharedUserDefault(); 
  2. if(save->getBoolForKey("isExisted")) 
  3.      //相關操作 
  4.      save->setBoolForKey("isExisted",true); 

參考文獻: cocos2d-x中保存用戶游戲數據CCUserDefault:http://blog.csdn.net/yanghuiliu/article/details/6912612

 

本文出自 “老G的小屋” 博客,請務必保留此出處http://4137613.blog.51cto.com/4127613/770754

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved