日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

cocos2d-x学习笔记16:记录存储1:CCUserDefault

發布時間:2025/5/22 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 cocos2d-x学习笔记16:记录存储1:CCUserDefault 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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


一、簡述 CCUserDefalt作為NSUserDefalt類的cocos2d-x實現版本,承擔了cocos2d-x引擎的記錄實現功能。
他的接口非常簡單。
  • 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.??

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

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

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

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

  • CCUserDefault?*save=CCUserDefault::sharedUserDefault();?
  • if(save->getBoolForKey("isExisted"))?
  • {?
  • ?????//相關操作?
  • ?????save->setBoolForKey("isExisted",true);?
  • }?

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

    ?

    總結

    以上是生活随笔為你收集整理的cocos2d-x学习笔记16:记录存储1:CCUserDefault的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。