博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
cocos2d-x学习笔记16:记录存储1:CCUserDefault
阅读量:6389 次
发布时间:2019-06-23

本文共 2450 字,大约阅读时间需要 8 分钟。

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

一、简述
CCUserDefalt作为NS
UserDefalt类的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); 
参考文献:

 

 本文转自 老G 51CTO博客,原文链接:http://blog.51cto.com/goldlion/770754,如需转载请自行联系原作者

你可能感兴趣的文章
手把手教你如何加入到github的开源世界! (转)
查看>>
NFS 配置服务
查看>>
iOS Swift编程语言
查看>>
Android 实现闹钟功能
查看>>
graal
查看>>
Win10 安装msi 提示2502、2503的错误代码 -- 命令提示符(管理员) -- msiexec /package...
查看>>
Vue.js 使用 Swiper.js 在 iOS < 11 时出现错误
查看>>
Underscore实例教程
查看>>
Nodejs+Express学习二(Mongoose基础了解)
查看>>
MySQL 性能监控4大指标——第一部分
查看>>
几种常见排序算法
查看>>
听我说说我的博客: 月访问量过万的个人IT博客的技术史
查看>>
数组去重的正确编写姿势
查看>>
Emulator 29.0.3 Canary 发布,Android 模拟器
查看>>
Ruby 3 有望引入静态类型
查看>>
Purism 发布 PureBoot:高度安全、完整的 Linux 引导流程
查看>>
JAVA学习day05
查看>>
行业观察(一)| 从渠道为王到数据为王——浅谈服装零售企业的数字化转型 ...
查看>>
阿里架构师,讲述分布式架构云平台解决方案(附学习路线) ...
查看>>
Android 访问WebService
查看>>