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

本文详细介绍了 Cocos2d-x 中 CCUserDefault 类的使用方法,包括其提供的基本接口及其在游戏开发中的应用。同时探讨了 CCUserDefault 的局限性,并提出了针对这些问题的建议解决方案。
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。 http://4137613.blog.51cto.com/4127613/770754

 

一、简述
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的小屋” 博客,请务必保留此出处http://4137613.blog.51cto.com/4127613/770754

基于数据驱动的 Koopman 算子的递归神经网络模型线性化,用于纳米定位系统的预测控制研究(Matlab代码实现)内容概要:本文围绕“基于数据驱动的 Koopman 算子的递归神经网络模型线性化,用于纳米定位系统的预测控制研究”展开,提出了一种结合数据驱动方法与Koopman算子理论的递归神经网络(RNN)模型线性化方法,旨在提升纳米定位系统的预测控制精度与动态响应能力。研究通过构建数据驱动的线性化模型,克服了传统非线性系统建模复杂、计算开销大的问题,并在Matlab平台上实现了完整的算法仿真与验证,展示了该方法在高精度定位控制中的有效性与实用性。; 适合人群:具备一定自动化、控制理论或机器学习背景的科研人员与工程技术人员,尤其是从事精密定位、智能控制、非线性系统建模与预测控制相关领域的研究生与研究人员。; 使用场景及目标:①应用于纳米级精密定位系统(如原子力显微镜、半导体制造设备)中的高性能预测控制;②为复杂非线性系统的数据驱动建模与线性化提供新思路;③结合深度学习与经典控制理论,推动智能控制算法的实际落地。; 阅读建议:建议读者结合Matlab代码实现部分,深入理解Koopman算子与RNN结合的建模范式,重点关注数据预处理、模型训练与控制系统集成等关键环节,并可通过替换实际系统数据进行迁移验证,以掌握该方法的核心思想与工程应用技巧。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值