Cocos2d-x数据篇01:UserDefault数据存储

前端之家收集整理的这篇文章主要介绍了Cocos2d-x数据篇01:UserDefault数据存储前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

【前言】

一个游戏怎么能没有游戏存档呢?在Cocos2d-x中也提供了一个数据存储类CCUserDefault,可以作为一个轻量级的数据库来使用。支持五种数据bool、int、float、double、string的存储。


【Demo下载】

UserDefault数据存储

【Cocos2d-x 3.x】

(1)去掉 “CC”

(2)获取单例:sharedUserDefault() 改为 getInstance()

(3)增加数据值:Data

1 @H_404_39@
2 @H_404_39@
3 @H_404_39@
4 @H_404_39@
// @H_404_39@
void setDataForKey( const char *pKey, const Data&value); @H_404_39@
DatagetDataForKey( Data&defaultValue=Data::Null); @H_404_39@
// @H_404_39@ @H_404_39@
@H_404_39@ @H_404_39@

(4)其他变化不大。

【CCUserDefault】

CCUserDefault类和之前讲的CCDirector、SimpleAudioEngine一样,都是采用单例模式。

可以通过sharedUserDefault()函数获取其唯一的实例对象。

CCUserDefault采用XML存储技术,就是一般的键值对,这个类似C++中的map的映射(键——值)。一个关键字对应一个值。其实现的接口也比较简单实用,通过传统的set()、get()方法访问和修改值。

支持五种数据:bool、int、float、double、string。

1、原理

(1)类似map的映射(键——值)。一个关键字对应一个值,并利用set()/get()进行访问。

(2)数据直接存储在一个XML文件中,并且文件名为程序项目的名字,如“MyTest.xml”。

(3)首次使用时,XML不存在,CCUserDefault会自动创建相应的XML文件

2、设置数据值set

通过(键——值)的方式进行设置。

4 @H_404_39@
5 @H_404_39@
6 @H_404_39@
7 @H_404_39@
setBoolForKey( bool value); //设置一个bool值 @H_404_39@
setIntegerForKey( int //设置一个int值 @H_404_39@
setFloatForKey( float //设置一个float值 @H_404_39@
setDoubleForKey( double //设置一个double值 @H_404_39@
setStringForKey( std::string&value); //设置一个string值 @H_404_39@
3、获取数据值get

通过关键字,来从XML文件获取数据值。

若关键字不存在,会自动设置(键——值)映射,并设置对应的默认值defaultValue。

7 @H_404_39@
// @H_404_39@
getBoolForKey( defaultValue= false ); //读取一个bool值 @H_404_39@
getIntegerForKey( defaultValue=0); //读取一个int值 @H_404_39@
getFloatForKey( defaultValue=0.0); //读取一个float值 @H_404_39@
getDoubleForKey( //读取一个double值 @H_404_39@
std::stringgetStringForKey( std::string&defaultValue= "" //读取一个string值 @H_404_39@
4、保存flush

当set完后,数据不会马上保存到XML文件中。

所以一定要记得用flush()来保存数据,否则会丢失!

3 @H_404_39@
// @H_404_39@
CCUserDefault::sharedUserDefault()->flush(); @H_404_39@
5、其他操作

获取单例对象、释放单例对象、获取XML文件路径、判断XML文件是否已经存在。

6 @H_404_39@
static CCUserDefault*sharedUserDefault(); //获取单例对象 @H_404_39@
static purgeSharedUserDefault(); //释放单例对象 @H_404_39@
const std::string&getXMLFilePath(); //获取XML路径 @H_404_39@
static isXMLFileExist(); //XML文件是否已创建 @H_404_39@
6、使用技巧

(1)每次操作都要打长长的CCUserDefault::sharedUserDefault(),来获得单例对象。是不是很麻烦呢?可以通过宏定义来缩短长度。

// @H_404_39@
#defineUserDefaultCCUserDefault::sharedUserDefault() @H_404_39@
(2)在使用的时候,要特别注意:区别 const char* 和 const std::string 是不一样的!

(3)当set完后,一定要记得用flush()来保存数据,否则会丢失!

代码实战】

代码来源于TestCpp项目中。

1、需要引用以下的头文件和命名空间

因为要用到C++的string类型。

4 @H_404_39@
#include<string> @H_404_39@
using namespace std; @H_404_39@
2、宏定义获取单例对象的函数

3、编写数据存储相关操作,并在控制台输出数据值

7 @H_404_39@
8 @H_404_39@
9 @H_404_39@
10 @H_404_39@
11 @H_404_39@
12 @H_404_39@
13 @H_404_39@
14 @H_404_39@
15 @H_404_39@
16 @H_404_39@
17 @H_404_39@
18 @H_404_39@
19 @H_404_39@
20 @H_404_39@
21 @H_404_39@
22 @H_404_39@
23 @H_404_39@
24 @H_404_39@
25 @H_404_39@
26 @H_404_39@
27 @H_404_39@
28 @H_404_39@
29 @H_404_39@ @H_896_404@ 30 @H_404_39@
31 @H_404_39@
32 @H_404_39@
33 @H_404_39@
34 @H_404_39@
35 @H_404_39@
36 @H_404_39@
//设置set @H_404_39@
UserDefault->setBoolForKey( "bool" ,153)!important">true ); @H_404_39@
UserDefault->setIntegerForKey( "integer" 404_39@
UserDefault->setFloatForKey( "float" 404_39@
UserDefault->setDoubleForKey( "double" 404_39@
UserDefault->setStringForKey( "string" "1111111" ); @H_404_39@
@H_404_39@
//获取get,并输出到控制台 @H_404_39@
//通过关键字,获取数据 @H_404_39@
b=UserDefault->getBoolForKey( ); @H_404_39@
i=UserDefault->getIntegerForKey( ); @H_404_39@
f=UserDefault->getFloatForKey( ); @H_404_39@
d=UserDefault->getDoubleForKey( ); @H_404_39@
stringret=UserDefault->getStringForKey( ); @H_404_39@
@H_404_39@
//输出到控制台 @H_404_39@
CCLOG((b== )? "boolistrue" : "boolisfalse" ); @H_404_39@
CCLOG( "integeris%d" 404_39@
"floatis%f" 404_39@
"doubleis%f" 404_39@
"stringis%s" 404_39@
@H_404_39@
//输出XML文件路径 @H_404_39@
if (UserDefault->isXMLFileExist()) //是否存在 @H_404_39@
{ @H_404_39@
stringpath=UserDefault->getXMLFilePath(); @H_404_39@
"XMLfileisexist!" ); @H_404_39@
"XMLfilepath:%s" 404_39@
} @H_404_39@
else @H_404_39@
{ @H_404_39@
"XMLfileisnotexist!" ); @H_404_39@ @H_404_599@ } @H_404_39@
//保存数据 @H_404_39@
UserDefault->flush(); @H_404_39@
4、运行结果

5、分析与总结

(1)不知道大家是否发现输出的结果有问题?float我设置的是33.33,为何输出的是33.330002。不是应该输出33.330000才对吗?

这个就要讲讲C++浮点数的精度问题了,float是单精度浮点数,而double是双精度浮点数。float的有效精度在6~7位,超过7位就可能会失真,就像上面的那个例子一样。而double的有效精度在15~16位,超过16位才会失真。具体的原理,自行百度吧!

(2)getXMLFilePath()获取的XML文件路径为绝对路径。另外XML文件保存的路径为项目的Debug.win32中,说明XML文件是保存在应用程序所在目录下的。

猜你在找的Cocos2d-x相关文章