【IOS-COCOS2D-X 游戏开发之五】游戏存储之COCOS2DX自带CCUSERDEFAULT类详解;

本站文章均为 李华明Himi 原创,转载务必在明显处注明: 
转载自【黑米GameDev街区】 原文链接: http://www.himigame.com/iphone-cocos2dx/653.html

本篇跟大家分享下Cocos2dX中的存储,其中也介绍些细节容易犯错的问题;

在Cocos2dX中提供了自带存储类:CCUserDefault  ,当然了这里Himi强调一点,如果你的数据量比较大,建议使用SQL存储比较适合,另外一点要注意的是,尽可能不要在Cocos2dX中使用与平台相关的api进行开发,例如Xcode使用Cocos2dX进行开发游戏时不小心使用了iOS的控件/组件在项目中,那么当移植到Android等平台的时候就肯定异常费劲,估计连正常运行都不可能,因为其他平台不可能正好有iOS的这些控件,即使有也肯定底层实现不一样!换句话而言,神马功能都使用Cocos2dX api实现,尽量都向X靠拢吧,所以这里的存储我也使用X自带的CCUserDefault;至少使用Cocos2dX自带的对于跨平台这一块肯定支持的比较好啦;

言归正传,先大致介绍一下这个类的API:

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

Public Member Functions

 

~CCUserDefault ()

bool getBoolForKey (const char *pKey, bool defaultValue=false)

Get bool value by key, if the key doesn't exist, a default value will return.

int getIntegerForKey (const char *pKey, int defaultValue=0)

Get integer value by key, if the key doesn't exist, a default value will return.

float getFloatForKey (const char *pKey, float defaultValue=0.0f)

Get float value by key, if the key doesn't exist, a default value will return.

double getDoubleForKey (const char *pKey, double defaultValue=0.0)

Get double value by key, if the key doesn't exist, a default value will return.

std::string getStringForKey (const char *pKey, const std::string &defaultValue="")

Get string value by key, if the key doesn't exist, a default value will return.

void setBoolForKey (const char *pKey, bool value)

Set bool value by key.

void setIntegerForKey (const char *pKey, int value)

Set integer value by key.

void setFloatForKey (const char *pKey, float value)

Set float value by key.

void setDoubleForKey (const char *pKey, double value)

Set double value by key.

void setStringForKey (const char *pKey, const std::string &value)

Set string value by key.

void flush ()

Save content to xml file.

Static Public Member Functions

 

static CCUserDefault * sharedUserDefault ()

static void purgeSharedUserDefault ()

static const std::string & getXMLFilePath ()

从以上可以一目了然CCUserDefault的使用和功能,哈希表结构,Key -Value,key索引Value值;

提供的存储都是些基础类型,bool,int,string,double,float,方法很容易懂:存储使用set ,获取使用get   !

那么最后static方法中可以看到CCUserDefault类留出了一个sharedUserDefault作为接口供开发者使用,那么大概介绍后,下面我们来写几段代码验证下:

1

2

3

4

5

6

7

8

//我们这里简单存储条数据

    CCUserDefault::sharedUserDefault()->setStringForKey("key", "himi");

    CCUserDefault::sharedUserDefault()->flush();//这里一定要提交写入哦,否则不会记录到xml中,下次启动游戏你就获取不到value了。

    //这里随便定义一个string为了验证我们的存储

    string str= "wahaha";

    //取出我们刚存储的himi,然后赋值给str验证下;

    str= CCUserDefault::sharedUserDefault()->getStringForKey("key");

    CCLog("打印str=:%s",str.c_str());

这里要注意,    CCUserDefault中有个  flush()的函数,这个用来将数据写入xml文件中,也就是说当你使用setXX的一些函数后记得提交(调用一下flush函数)

OK,下面是控制台输入的结果:

1

2

3

4

5

6

7

8

9

10

11

12

13

Cocos2d: cocos2d: cocos2d-1.0.1-x-0.12.0

Cocos2d: cocos2d: GL_VENDOR:     Imagination Technologies

Cocos2d: cocos2d: GL_RENDERER:   PowerVR SGX 543

Cocos2d: cocos2d: GL_VERSION:    OpenGL ES-CM 1.1 IMGSGX543-63.14.2

Cocos2d: cocos2d: GL_MAX_TEXTURE_SIZE: 4096

Cocos2d: cocos2d: GL_MAX_MODELVIEW_STACK_DEPTH: 16

Cocos2d: cocos2d: GL supports PVRTC: YES

Cocos2d: cocos2d: GL supports BGRA8888 textures: NO

Cocos2d: cocos2d: GL supports NPOT textures: YES

Cocos2d: cocos2d: GL supports discard_framebuffer: YES

Cocos2d: cocos2d: compiled with NPOT support: NO

Cocos2d: cocos2d: compiled with VBO support in TextureAtlas : NO

Cocos2d: 打印str=:himi

最后一句验证了我们的存储没问题,那么我们现在验证是否真的存在xml中了,首先停止当前运行的项目,然后删除刚才代码替换如下代码:

1

CCLog("打印str=:%s",CCUserDefault::sharedUserDefault()->getStringForKey("key").c_str());

然后重新运行此项目,观察控制台打印如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

Cocos2d: cocos2d: cocos2d-1.0.1-x-0.12.0

Cocos2d: cocos2d: GL_VENDOR:     Imagination Technologies

Cocos2d: cocos2d: GL_RENDERER:   PowerVR SGX 543

Cocos2d: cocos2d: GL_VERSION:    OpenGL ES-CM 1.1 IMGSGX543-63.14.2

Cocos2d: cocos2d: GL_MAX_TEXTURE_SIZE: 4096

Cocos2d: cocos2d: GL_MAX_MODELVIEW_STACK_DEPTH: 16

Cocos2d: cocos2d: GL supports PVRTC: YES

Cocos2d: cocos2d: GL supports BGRA8888 textures: NO

Cocos2d: cocos2d: GL supports NPOT textures: YES

Cocos2d: cocos2d: GL supports discard_framebuffer: YES

Cocos2d: cocos2d: compiled with NPOT support: NO

Cocos2d: cocos2d: compiled with VBO support in TextureAtlas : NO

Cocos2d: 打印str=:himi

通过刚才的key->”key”,正常获取到“himi”这个字符串了,OK,监测没问题;

那么一般情况下我们会需要一个方法就是判定当前项目是否已经有存储数据的xml文件存在了,那么Himi这里说下,Cocos2dX默认源码中有这个方法,但是并没有提供给开发者使用,因为此函数被private私有了,此函数源码如下图所示:

       那么既然如此Himi这里就自定义了一个检测是否已存在数据xml的函数提供大家使用:(提醒:很多童鞋该说啦,为什么不直接修改源码将其public呢?!其实Himi也这么想,但是如果你后期使用了新的Cocos2dX的版本,或者同事机器的Cocos2dX并没有这么修改源码都会产生错误,反过来说,既然能很容易的写出一个判断的方法何必去动它呢,不是么?哈哈!)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

.h文件:

bool isHaveSaveFile();

 

.cpp文件:

//当前项目是否存在存储的xml文件

bool HelloWorld::isHaveSaveFile(){

    if(!CCUserDefault::sharedUserDefault()->getBoolForKey("isHaveSaveFileXml"))

    {

        CCUserDefault::sharedUserDefault()->setBoolForKey("isHaveSaveFileXml", true);

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

        //        CCLog("存储文件不存在,头次开始加载游戏");

        return false;

    }else{

        //        CCLog("存储文件已存在");

        return true;

    }

}

备注:当存储数据的xml不存在的时候,你的第一次存储数据的时候默认会创建,路径在你的app下的documents,如下图所示:

 

 那么这里Himi强调一点!大家要注意setXX的函数的参数,例如以下这个函数:

setStringForKey (const char *pKey, const std::string &value)

第一个参数是const char*类型,不是string!!!!(Himi因为这个原因浪费不少时间,悲剧阿。)

Himi当时存储写了如下代码,造成错误,如下:

1

CCUserDefault::sharedUserDefault()->setStringForKey(""+823, sKey);

错误截图如下:(存储的key变成了路径。。。。《数据是Himi加密后的》)

   哎,郁闷,这里Himi犯错希望童鞋们不要再范此错误,之前Himi一直想找 itoa 找个函数,但是怎么都找不到!(c++  应该存在的整形转字符串),但是Cocos2dX中没有,并且最后Himi使用了与Cocos2dX引擎中的实现itoa的源码,发现如下:

Cocos2dX自带的这个CCUserDefault并不是加密的,而是明文并且是.xml格式的,所以后续Himi准备写一篇使用base64来进行加密的文章供大家参考;

本篇源码下载: “SaveDataForCocos2dx.zip”        下载地址:  http://vdisk.weibo.com/s/hq2Ys

 

时间: 2024-11-01 22:19:28

【IOS-COCOS2D-X 游戏开发之五】游戏存储之COCOS2DX自带CCUSERDEFAULT类详解;的相关文章

【ANDROID游戏开发十九】(必看篇)SURFACEVIEW运行机制详解—剖析BACK与HOME按键及切入后台等异常处理!

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/android-game/346.html 在这里先向各位童鞋道个歉!我解释下:当我在给大家讲解的时候会附带上源码,可是这个源码是演示代码,为了让大家看的清楚,所以我会尽可能把一些与其无关的删掉,但是发现演示代码还是被一些童鞋们效仿,导致不少童鞋问我为什么程序执行后切入后台重新进入会报异常的问题!(这里我就全面讲解下运行机制,希望以后大家有类

【IOS-COCOS2D-X 游戏开发之六】使用BASE64算法对COCOS2DX自带CCUSERDEFAULT游戏存储数据编码加密!

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/iphone-cocos2dx/659.html 上一篇介绍了,如何使用Cocos2dX自带的CCUserDefault 存储游戏数据,那么Himi也提到此方式保存的为xml格式并且数据明文显示=. =,这个对于我们开发者来说太暴漏了有木有! so-本篇Himi分享如何使用经典Base64算法对CCUserDefault进行数据编码形成一种简

【ANDROID游戏开发之五】游戏注册界面DEMO-实现两个ACTIVITY之间的切换与数据交互!

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/android-game/301.html ----------------------- 『很多童鞋说我的代码运行后,点击home或者back后会程序异常,如果你也这样遇到过,那么你肯定没有仔细读完Himi的博文,第十九篇Himi专门写了关于这些错误的原因和解决方法,这里我在博客都补充说明下,省的童鞋们总疑惑这一块:请点击下面联系进入阅读:

Unity3D游戏开发,游戏体碰撞问题,请教!

问题描述 Unity3D游戏开发,游戏体碰撞问题,请教! 初学unity3d,遇到个问题,想请教一下大家! 买了一本unity3d游戏开发的书,实现一个小项目实例,太空射击游戏,现在我把敌机,主角和子弹都放在了场景上了,主角能发射子弹: 也按照书上给敌机.子弹.主角添加了相关组件,运行时碰撞没有效果.请指点! 解决方案 它们是在同一个场景层还是同一个,如果是不同的场景层应该没有效果吧: 你再仔细检查一下代码: 如果回答对你有帮助,请采纳 解决方案二: http://wenku.baidu.com

游戏编程-求智能算法相关书籍,需要那种带实例有详解的(单一一种算法的书籍也可)

问题描述 求智能算法相关书籍,需要那种带实例有详解的(单一一种算法的书籍也可) 我看过<游戏编程中的人工智能技术> <MATLAB神经网络应用设计> 张德丰版 <MATLAB在数学建模中的应用> 卓金武 <MATLAB应用实例精讲--数学数值计算和统计分析篇> <MATLAB遗传算法工具箱及应用> 雷英杰版 <MATLAB神经网络 30个案例分析> 北京航天航空大学 <MATLAB智能算法超级学习手册> <MATLA

Android开发之基本控件和四种布局方式详解_Android

Android中的控件的使用方式和iOS中控件的使用方式基本相同,都是事件驱动.给控件添加事件也有接口回调和委托代理的方式.今天这篇博客就总结一下Android中常用的基本控件以及布局方式.说到布局方式Android和iOS还是区别挺大的,在iOS中有Frame绝对布局和AutoLayout相对布局.而在Android中的布局方式就比较丰富了,今天博客中会介绍四种常用的布局方式.先总结一下控件,然后再搞一搞基本方式,开发环境还是用的Mac下的Android Studio.开始今天的正题, 虽然A

Android开发之基本控件和四种布局方式详解

Android中的控件的使用方式和iOS中控件的使用方式基本相同,都是事件驱动.给控件添加事件也有接口回调和委托代理的方式.今天这篇博客就总结一下Android中常用的基本控件以及布局方式.说到布局方式Android和iOS还是区别挺大的,在iOS中有Frame绝对布局和AutoLayout相对布局.而在Android中的布局方式就比较丰富了,今天博客中会介绍四种常用的布局方式.先总结一下控件,然后再搞一搞基本方式,开发环境还是用的Mac下的Android Studio.开始今天的正题, 虽然A

C语言 存储类详解及示例代码_C 语言

C 存储类 存储类定义 C 程序中变量/函数的范围(可见性)和生命周期.这些说明符放置在它们所修饰的类型之前.下面列出 C 程序中可用的存储类: auto register static extern auto 存储类 auto 存储类是所有局部变量默认的存储类. { int mount; auto int month; } 上面的实例定义了两个带有相同存储类的变量,auto 只能用在函数内,即 auto 只能修饰局部变量. register 存储类 register 存储类用于定义存储在寄存器

【COCOS2D-X(2.X) 游戏开发系列之二】COCOS2DX最新2.X版本跨平台整合NDK+XCODE,XCODE编写&amp;编译代码,ANDROID导入打包运行即可!

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/cocos2dx-v2-0/962.html 前段时间有事情不在北京也很少上网所以一直没有更新博客,那么今天Himi向大家分享一下最新cocos2dx 2.0.1版本整合Xcode 编译运行Android的博文: 首先Himi使用的引擎版本是cocos2dx 2.0: 主要特点: 使用opengl es2.0支持CocosBuilder集成了