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

尊重原创:http://cn.cocos2d-x.org/tutorial/show?id=2418

【前言】

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

【Demo下载】

UserDefault数据存储

【Cocos2d-x 3.x】

(1)去掉 “CC”

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

(3)增加数据值:Data


1

2

3

4

//

void setDataForKey(const char* pKey, const Data& value);

Data getDataForKey(const char* pKey, const Data& defaultValue = Data::Null);

//

(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

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


1

2

3

4

5

6

7

//

void setBoolForKey(   const char* pKey, bool value);               //设置一个bool值

void setIntegerForKey(const char* pKey, int value);                //设置一个int值

void setFloatForKey(  const char* pKey, float value);              //设置一个float值

void setDoubleForKey( const char* pKey, double value);             //设置一个double值

void setStringForKey( const char* pKey, const std::string& value); //设置一个string值

//

3、获取数据值get

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

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


1

2

3

4

5

6

7

//

bool getBoolForKey(   const char* pKey, bool defaultValue = false);                   //读取一个bool值

int getIntegerForKey(const char* pKey, int defaultValue = 0);                         //读取一个int值

float getFloatForKey(  const char* pKey, float defaultValue = 0.0);                   //读取一个float值

double getDoubleForKey( const char* pKey, double defaultValue = 0.0);                 //读取一个double值

std::string getStringForKey( const char* pKey, const std::string& defaultValue = ""); //读取一个string值

//

4、保存flush

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

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


1

2

3

//

CCUserDefault::sharedUserDefault()->flush();

//

5、其他操作

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


1

2

3

4

5

6

//

static CCUserDefault* sharedUserDefault();  //获取单例对象

static void purgeSharedUserDefault();       //释放单例对象

const static std::string& getXMLFilePath(); //获取XML路径

static bool isXMLFileExist();               //XML文件是否已创建

//

6、使用技巧

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


1

2

3

//

#define UserDefault CCUserDefault::sharedUserDefault()

//

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

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

【代码实战】

代码来源于TestCpp项目中。

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

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


1

2

3

4

//

#include <string>

using namespace std;

//

2、宏定义获取单例对象的函数


1

2

3

//

#define UserDefault CCUserDefault::sharedUserDefault()

//

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


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

//设置set

UserDefault->setBoolForKey(   "bool",    true);

UserDefault->setIntegerForKey("integer", 100);

UserDefault->setFloatForKey(  "float",   33.33f);

UserDefault->setDoubleForKey( "double",  44.44);

UserDefault->setStringForKey( "string",  "1111111");

 

//获取get,并输出到控制台

//通过关键字,获取数据

bool b = UserDefault->getBoolForKey("bool");

int i = UserDefault->getIntegerForKey("integer");

float f = UserDefault->getFloatForKey("float");

double d = UserDefault->getDoubleForKey("double");

string ret = UserDefault->getStringForKey("string");

 

//输出到控制台

CCLOG( (b == true)? "bool is true" "bool is false" );

CCLOG("integer is %d", i);

CCLOG("float is %f", f);

CCLOG("double is %f", d);

CCLOG("string is %s", ret.c_str());

 

//输出XML文件路径

if( UserDefault->isXMLFileExist() ) //是否存在

{

    string path = UserDefault->getXMLFilePath();

    CCLOG("XML file is exist!");

    CCLOG( "XML file path : %s", path.c_str() );

}

else

{

    CCLOG("XML file is not exist!");

}

//保存数据

UserDefault->flush();

//

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文件是保存在应用程序所在目录下的。

时间: 2024-12-07 22:17:42

Cocos2d-x数据篇01:UserDefault数据存储的相关文章

OS开发UI篇—ios应用数据存储方式(归档)

OS开发UI篇—ios应用数据存储方式(归档)  一.简单说明 在使用plist进行数据存储和读取,只适用于系统自带的一些常用类型才能用,且必须先获取路径相对麻烦: 偏好设置(将所有的东西都保存在同一个文件夹下面,且主要用于存储应用的设置信息) 归档:因为前两者都有一个致命的缺陷,只能存储常用的类型.归档可以实现把自定义的对象存放在文件中. 二.代码示例 1.文件结构 2.代码示例 YYViewController.m文件 1 // 2 // YYViewController.m 3 // 02

iOS开发UI篇—ios应用数据存储方式(归档)

iOS开发UI篇-ios应用数据存储方式(归档)  一.简单说明 在使用plist进行数据存储和读取,只适用于系统自带的一些常用类型才能用,且必须先获取路径相对麻烦: 偏好设置(将所有的东西都保存在同一个文件夹下面,且主要用于存储应用的设置信息) 归档:因为前两者都有一个致命的缺陷,只能存储常用的类型.归档可以实现把自定义的对象存放在文件中. 二.代码示例 1.文件结构 2.代码示例 YYViewController.m文件 1 // 2 // YYViewController.m 3 // 0

iOS开发UI篇—ios应用数据存储方式(偏好设置)

iOS开发UI篇—ios应用数据存储方式(偏好设置) 一.简单介绍 很多iOS应用都支持偏好设置,比如保存用户名.密码.字体大小等设置,iOS提供了一套标准的解决方案来为应用加入偏好设置功能 每个应用都有个NSUserDefaults实例,通过它来存取偏好设置.比如,保存用户名.字体大小.是否自动登录 存储位置: 存储形式: 二.代码示例 1.storyboard 2.代码 1 // Created by 鑫 on 14-10-24. 2 // Copyright (c) 2014年 梁镋鑫.

iOS开发UI篇—ios应用数据存储方式(XML属性列表-plist

iOS开发UI篇—ios应用数据存储方式(XML属性列表-plist) 一.ios应用常用的数据存储方式 1.plist(XML属性列表归档) 2.偏好设置 3.NSKeydeArchiver归档(存储自定义对象) 4.SQLite3(数据库,关系型数据库,不能直接存储对象,要编写一些数据库的语句,将对象拆开存储) 5.Core Data(对象型的数据库,把内部环节屏蔽) 二.应用沙盒 每个iOS应用都有?己的应?沙盒(应用沙盒就是文件系统目录),与其他文件系统隔离.应?必须待在?己的沙盒里,其

iOS开发UI篇—ios应用数据存储方式(XML属性列表-plist)

一.ios应用常用的数据存储方式 1.plist(XML属性列表归档) 2.偏好设置 3.NSKeydeArchiver归档(存储自定义对象) 4.SQLite3(数据库,关系型数据库,不能直接存储对象,要编写一些数据库的语句,将对象拆开存储) 5.Core Data(对象型的数据库,把内部环节屏蔽) 二.应用沙盒 每个iOS应用都有?己的应?沙盒(应用沙盒就是文件系统目录),与其他文件系统隔离.应?必须待在?己的沙盒里,其他应用不能访问该沙盒(提示:在IOS8中已经开放访问) 应?沙盒的文件系

iOS开发-数据篇-sqlite存储

简介:iOS开发的持久化数据存储有4种方式:NSUserDefault和.plist.NSKeyedArchiver和NSKeyedUnarchiver.sqlite3数据库.CoreData. sqlite3和CoreData适合存储大量数据(内容数据等),而另外两种适合存储简单数据(语言,字体,标记等简单数据存储). 准备:这里主要介绍利用sqlite3封装的FMDatabase的数据库,(当然还有PlausibleDatabase.sqlitepersistentobjects等其他封装的

R语言笔记之数据篇

R语言杂七杂八 与R语言有关的应用工具 探索性数据分析 统计推断 回归分析 机器学习-分类问题 R与Rstudio的获取与安装 包package一种扩展R基本功能的机制集成了众多函数 获取包 导入包libraryname 获取帮助 R语言特点 R语言语法基础之数据篇 R语言中的数据 R语言支持的数据类型 基本数据结构 一维数据类型 向量 vocter 1创建 2提取子集 因子 factor 1创建 2提取子集 二维数据类型 矩阵 matrix 1生成矩阵 1matrix方法 2 修改dim属性来

硅谷观察之大数据篇【下】:硅谷巨头们的大数据玩法

在硅谷观察之大数据篇的[上]篇中,我把硅谷地区大数据生长状况基本梳理了一个相对完整的形状出来.有朋友看了[下]的预告后在微博上给我留言说,听说下篇要介绍一些公司的大数据部门情况,问能不能点名加个Google尤其是Google Maps,因为特别想知道这个世界上最大的搜索引擎以及每天必不可少的出行神器是怎么当一个挖掘机的. 于是,上周我又去了Google采访.本篇将一共呈现硅谷四大不同类型的公司如何玩转大数据,其中包括了著名FLAG中的三家(Apple在大数据这块来说表现并不突出). 本篇内容来自

[安卓基础] 012.存储数据(下)——文件存储

*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } a { color: #4183C4; text-decoration: none; } a.absent { color: #cc0000; } a.anchor { display: block; padding-left: 30px; margin-left: -30px; cursor: poin