博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
cocos2dX 之数据存储
阅读量:7222 次
发布时间:2019-06-29

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

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

看看, 你能看懂吗?

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

你可能感兴趣的文章
退火算法
查看>>
排序算法之桶排序
查看>>
The world beyond batch: Streaming 101
查看>>
在指定文件夹中查找指定关键字,并输出关键字包括的次数
查看>>
js 字符串 replace replaceAll
查看>>
Python动态监控日志的内容
查看>>
微信双开是定时炸弹?关于非越狱iOS上微信分身高危插件ImgNaix的分析
查看>>
Mldonkey的配置
查看>>
生产库快速关闭数据库
查看>>
分离自Discuz模板类和语法
查看>>
UNIX/Linux环境编程必须需要注意的问题总结
查看>>
Cocos2d-x初入学堂(17)--&gt;打包成APK中文显示乱码
查看>>
为PetaPoco添加实体模板
查看>>
Magento 常用方法和插件
查看>>
Meteor+Vue 从入门到放弃
查看>>
Zookeeper简介
查看>>
Android2.2 API 中文文档系列(2) —— EditText
查看>>
【转载】MySQL Query Cache 小结
查看>>
【直播预告】百川解码——热修复的坑和阿里的解
查看>>
使用oledb读写excel出现“操作必须使用一个可更新的查询”的解决办法
查看>>