cocos2dX 之数据存储

今天我们来看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");	//取出stringttf->setString( str.c_str());	//将字符串的标题设为str} else{//没有数据CCUserDefault::sharedUserDefault()->setStringForKey( "str", "now, hava data");	//写入字符串CCUserDefault::sharedUserDefault()->setBoolForKey( "flag", true);		//写入boolCCUserDefault::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文件:



看看, 你能看懂吗?



好了, 今天就到这里, 我发现近期的东西会不会是越来越简单了啊, 过段时间给来点有难度的偷笑

转载于:https://www.cnblogs.com/jhcelue/p/7137826.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/416423.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端学习(2482):关于接口的调错

request.js <template> <div class"artical-container"><!--卡片--><el-card class"filter-card"><div slot"header" class"clearfix"><!--面包屑导航--><el-breadcrumb separator-class&quo…

java 字符串数组转int数组_java怎么把字符型数组转换为int型?

展开全部String s "485729304";int[] a new int[s.length()];for(int i 0; i < s.length(); i){//先由字符串转换成char,再转换成String,然后Integera[i] Integer.parseInt( String.valueOf(s.charAt(i)));}//字符串中的数据一定要是数字&#xff0c;否则会出…

php 小知识随手记 new self() 和new static()作用和区别

A.new self() 返回代码段所以在的类 B.new static()返回的是当前实例化的类 例子&#xff1a; 转载于:https://www.cnblogs.com/walksnow/p/7141999.html

ThinkPHP框架知识的注意点

ThinkPHP框架 访问入口文件后在application文件夹中会出现一些文件夹&#xff0c;其中的home文件夹是前端模块&#xff0c;也可以在application文件夹中新建文件夹。home文件夹模块中Conf文件夹的config配置文件&#xff0c;是对于当前模块的&#xff1a;修改当前模式conventio…

什么是哈希表?

哈希表是用于查找的一种表&#xff0c;它是根据某一函数H(key)key,来确定某一元素的存储位置&#xff0c;构造哈希表的方法&#xff0c;一般有&#xff1a;或是它的线性函数&#xff0c;来构造&#xff1b;还有除留余数法等等&#xff1b;构造这种表的过程叫哈希造表&#xff0…

前端学习(2485):vue里面的this指向

一、普通函数中的this 这是vue文档里的原话&#xff1a; All lifecycle hooks are called with their this context pointing to the Vue instance invoking it. 意思是&#xff1a;在Vue所有的生命周期钩子方法&#xff08;如created&#xff0c;mounted&#xff0c; updated…

java 单元测试用例_Java单元测试和JUnit

**********************单元测试和JUnit********************************为什么要使用单元测试1.底层代码没问题,上一层才不会出现问题.. 就像盖楼一样2.提高士气&#xff0c;明确知道我的东西是没问题的, 保证你不被开3.加大测试的力度可以降低后期维护的成本一.什么是JUnitJ…

5专题总结-数据结构

专题5-数据结构 2017-07-13 C Primer P329好好研读&#xff0c;stack,queue,priority_queue都是顺序容器适配器adaptor。&#xff08;接受一种已有的容器类型&#xff0c;使其行为看起来像另一种事物一样&#xff09; 适配器的底层容器&#xff08;array和forward_list都不行&a…

mysql8.0创建属性_MySQL8.0新特性——资源管理

MySQL8.0——资源管理&#xff1a;参考官方文档&#xff1a;https://dev.mysql.com/doc/refman/8.0/en/resource-groups.htmlMySQL支持资源组的创建和管理&#xff0c;并允许将服务器内运行的线程分配给特定组&#xff0c;以便线程根据组可用的资源执行。组属性可以控制其资源&…

Ribbon自带负载均衡策略比较

Ribbon自带负载均衡策略比较 策略名策略声明策略描述实现说明BestAvailableRulepublic class BestAvailableRule extends ClientConfigEnabledRoundRobinRule选择一个最小的并发请求的server逐个考察Server&#xff0c;如果Server被tripped了&#xff0c;则忽略&#xff0c;在选…

java byte数组转int数组_Java任意长度byte数组转换为int数组的方法

前言嗯。最近工程上遇到一个byte数组转换为int的问题&#xff0c;解决过程中遇到了几个坑&#xff0c;经过各种查资料终于还是解决了。撒花。Java的位运算以及byte数组与其他类型数据的转换比c/c感觉麻烦一些。这里简单说明一下byte数组和int的转换吧。总所周知&#xff0c;int…

newcondition java_Java并发Condition接口

全屏java.util.concurrent.locks.Condition接口提供一个线程挂起执行的能力&#xff0c;直到给定的条件为真。 Condition对象必须绑定到Lock&#xff0c;并使用newCondition()方法获取对象。Condition类的方法以下是Condition类中可用的重要方法的列表。序号方法名称描述1publi…

前端学习(2486):$emit

1、父组件可以使用 props 把数据传给子组件。 2、子组件可以使用 $emit 触发父组件的自定义事件。 vm.$emit( event, arg ) //触发当前实例上的事件 vm.$on( event, fn );//监听event事件后运行 fn&#xff1b; 例如&#xff1a;子组件&#xff1a; <template><di…

葡萄城报表介绍:B/S 报表软件

葡萄城报表介绍&#xff1a;B/S 报表软件 B/S 报表软件定义 B/S&#xff08;Browser/Server&#xff0c;浏览器/服务器模式&#xff09;也称 B/S 结构&#xff0c;是 WEB 兴起后的一种网络结构模式。B/S 模式是由最开始的 C/S&#xff08;Client/Server&#xff0c;客户机/服务…