cocos2dx基础篇(20)——数据存储CCUserDefault

【唠叨】

一个游戏怎么能没有游戏存档呢?在cocos2dx中也提供了一个数据存储类CCUserDefault,可以作为一个轻量级的数据库来使用。

它支持五种数据bool、int、float、double、string的存储。

【致谢】

http://gl.paea.cn/contents/252ac3e59bc18069.html



【CCUserDefault】

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

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

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

它支持五种数据:boolintfloatdoublestring

1、原理

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

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

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

2、设置数据值set

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

	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。

	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()来保存数据,否则会丢失!

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

5、其他操作

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

//
	static CCUserDefault* sharedUserDefault();  //获取单例对象
	static void purgeSharedUserDefault(); 	    //释放单例对象
	const static std::string& getXMLFilePath(); //获取XML路径
	static bool isXMLFileExist();               //XML文件是否已创建
//

6、使用技巧

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

//
	#define UserDefault CCUserDefault::sharedUserDefault()
//

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

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



【代码实战】

代码来源于TestCpp项目中。

(1)需要用到C++的string类型,所以需要引用以下的头文件和命名空间。

//
	#include <string>
	using namespace std;
//

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

//
	#define UserDefault CCUserDefault::sharedUserDefault()
//

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

//设置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();

//

运行结果:

分析:

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



【Demo下载】

时间: 2024-07-29 00:14:06

cocos2dx基础篇(20)——数据存储CCUserDefault的相关文章

cocos2dx基础篇(7)——菜单按钮CCMenu、CCMenuItem

[本节内容] 菜单按钮在游戏中是经常被用到的,比如主菜单界面的菜单选项,暂停游戏时的菜单选项等等.cocos2dx引擎同样为我们提供了CCMenu菜单的功能,并包含了一些简单的菜单项CCMenuItem.且菜单项附带触碰按钮时,自动放大的效果. 温馨提示:本节内容比较多,需要大家慢慢分析,不要急于求成. 本节组织结构如下: 一.介绍CCMenu. 二.介绍CCMenuItem,及其具体的六个子类. 三.代码实战. [一.菜单CCMenu] 菜单CCMenu是专门用来承载菜单按钮的CCLayer图

cocos2dx基础篇(10)——开关按钮CCControlSwitch

[本节内容] 开关类CCControlSwitch继承于控件类CCControl. 控件类CCControl主要向子类提供了一系列的控件触发事件.当子控件触发相关的事件后,就会执行相关的控件事件回调函数.这与之前讲的CCMenu中的菜单按钮回调是类似的. 控件类CCControl主要有三个子类: (1)开关控件CCControlSwitch (2)滑块控件CCControlSlider (3)按钮控件CCControlButton 本节讲的是其子类其中之一:开关类CCControlSwitch.

cocos2dx基础篇(12)——点九图CCScale9Sprite

[引言] 本来是想学学控件类CCControl的另一个子类按钮控件CCControlButton的.但是发现里面有一个参数牵扯到CCScale9Sprite这个类.看到CCScale9Sprite,很容易联想到精灵类CCSprite.两者又有什么区别呢?因此我就去网上收了一些有关CCScale9Sprite的资料来学习. [参考文献] [1] http://blog.csdn.net/nynyvkhhiiii/article/details/12782249 [2] http://www.cnb

cocos2dx基础篇(13)——按钮控件CCControlButton

[引言] 按钮类CCControlButton继承于控件类CCControl. 控件类CCControl主要向子类提供了一系列的控件触发事件.当子控件触发相关的事件后,就会执行相关的控件事件回调函数.这与之前讲的CCMenu中的菜单按钮回调是类似的. 控件类CCControl主要有三个子类: (1)开关控件CCControlSwitch (2)滑块控件CCControlSlider (3)按钮控件CCControlButton 本节讲的是其子类其中之一:按钮类CCControlButton. [

cocos2dx基础篇(4)——浅析cocos2dx引擎目录

通过前面几节的学习,相信大家都已经配置好了VS+cocos2dx2.2.3的环境,并且成功运行了官方的案例HelloWorld. 一.窥探文件目录 要想学好cocos2dx,首先就需要对引擎目录下的各个文件有所了解.接下来,就让我们先来分析一下cocos2dx2.2.3引擎的文件目录吧. 从目录中我们主要了解一下一下几个文件: cocos2dx:cocos2d-x引擎的核心部分,存放了引擎的大部分源文件. CocosDenshion:声音模块相关源文件. Debug.win32:在Windows

cocos2dx基础篇(5)——浅析几个常见类

目录 入口类main.cpp 主要控制类AppDelegate.cpp 节点类CCNode 导演类CCDirector 场景类CCScene 层次类CCLayer 精灵类CCSprite 大小类CCSize 坐标CCPoint 矩形类CCRect 数组类CCArray 入口类main.cpp 这是应用程序的入口类,用于创建cocos2dx的AppDelegate实例.窗口大小.以及运行程序. 主要代码如下:     // create the application instance     A

cocos2dx基础篇(8)——定时器更新schedule、update

[本节内容] 定时器在大部分游戏中是不可或缺的,即每隔一段时间,就要执行相应的刷新体函数,以更新游戏的画面.时间.进度.敌人的指令等等. cocos2dx为我们提供了定时器schedule相关的操作.其操作函数的定义在CCNode中,所以基本上大多数的引擎类都可以设置定时器,如CCLayer.CCSprite.CCMenu等. 定时器更新的方式分为三类: (1)默认定时器:scheduleUpdate(); (2)自定义定时器:schedule(); (3)一次性定时器:scheduleOnce

【读书笔记《Android游戏编程之从零开始》】20.游戏开发基础(游戏数据存储)

对于数据的存储,Android 提供了4种保存方式. (1)SharedPreference 此方法适用于简单数据的保持,文如其名,属于配置性质的保存,不适合比较大的情况,默认存放在手机内存里 (2)FileInputStream/FileOutputStream 此方式比较适合游戏的保存和使用,流文件数据存储可以保持较大的数据,而且通过此方式不仅能把数据存储在手机内存中,也能将数据保存到手机额SDcard中. (3)SQLite 此方式也适合游戏的保存和使用,不仅可以保存较大的数据,而且可以将

iOS UI基础-13.0 数据存储

应用沙盒 每个iOS应用都有自己的应用沙盒(应用沙盒就是文件系统目录),与其他文件系统隔离.应用必须待在自己的沙盒里,其他应用不能访问该沙盒 应用沙盒的文件系统目录,如下图所示(假设应用的名称叫Layer) 模拟器应用沙盒的根路径在: (apple是用户名, 6.0是模拟器版本) /Users/apple/Library/Application Support/iPhone Simulator/6.0/Applications 应用沙盒结构分析 应用程序包:(上图中的Layer)包含了所有的资源