`

Cocos2dX自带CCUserDefault类详解

 
阅读更多

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

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

PublicMemberFunctions
 
    ~CCUserDefault()
bool    getBoolForKey (constchar*pKey,booldefaultValue=false)
    Getboolvalue by key,ifthe key doesn't exist, a defaultvalue will return.
int     getIntegerForKey (constchar*pKey, intdefaultValue=0)
    Get integer value by key, ifthe key doesn't exist, a defaultvalue will return.
float   getFloatForKey (constchar*pKey,floatdefaultValue=0.0f)
    Getfloatvalue by key,ifthe key doesn't exist, a defaultvalue will return.
double  getDoubleForKey (constchar*pKey, doubledefaultValue=0.0)
    Get doublevalue by key, ifthe key doesn't exist, a defaultvalue will return.
std::string     getStringForKey (constchar*pKey,conststd::string&defaultValue="")
    Getstring value by key,ifthe key doesn't exist, a defaultvalue will return.
void    setBoolForKey (constchar*pKey, boolvalue)
    Set boolvalue by key.
void    setIntegerForKey (constchar*pKey, intvalue)
    Set integer value by key.
void    setFloatForKey (constchar*pKey, floatvalue)
    Set floatvalue by key.
void    setDoubleForKey (constchar*pKey, doublevalue)
    Set doublevalue by key.
void    setStringForKey (constchar*pKey, conststd::string &value)
    Set string value by key.
void    flush ()
    Save content to xml file.
Static Public Member Functions
 
staticCCUserDefault *  sharedUserDefault ()
staticvoid     purgeSharedUserDefault ()
staticconststd::string &  getXMLFilePath ()

 

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

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

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

//我们这里简单存储条数据
    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,下面是控制台输入的结果:

Cocos2d: cocos2d: cocos2d-1.0.1-x-0.12.0
Cocos2d: cocos2d: GL_VENDOR:     ImaginationTechnologies
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 inTextureAtlas:NO
Cocos2d:打印str=:himi

 

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

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


然后重新运行此项目,观察控制台打印如下:
Cocos2d: cocos2d: cocos2d-1.0.1-x-0.12.0
Cocos2d: cocos2d: GL_VENDOR:     ImaginationTechnologies
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 inTextureAtlas:NO
Cocos2d:打印str=:himi

 

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

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

       

那么既然如此Himi这里就自定义了一个检测是否已存在数据xml的函数提供大家使用:

.h文件:

bool isHaveSaveFile();

 
.cpp文件:
//当前项目是否存在存储的xml文件
bool HelloWorld::isHaveSaveFile(){
    if(!CCUserDefault::sharedUserDefault()->getBoolForKey("isHaveSaveFileXml"))
    {
        CCUserDefault::sharedUserDefault()->setBoolForKey("isHaveSaveFileXml",true);
        CCUserDefault::sharedUserDefault()->flush();//提交
        //        CCLog("存储文件不存在,头次开始加载游戏");
        returnfalse;
    }else{
        //        CCLog("存储文件已存在");
        returntrue;
    }
}

 


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

 

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

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

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

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

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


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

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

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

分享到:
评论

相关推荐

    Cocos2d-x游戏开发之CCUserDefault类存储详解 源码

    Cocos2d-x游戏开发之CCUserDefault类存储详解博客链接 http://blog.csdn.net/cjsen/article/details/9059257

    Cocos2d-x实战:JS卷——Cocos2d-JS开发

    资源名称:Cocos2d-x实战:JS卷——Cocos2d-JS开发内容简介:本书是介绍Cocos2d-x游戏编程和开发技术书籍,介绍了使用Cocos2d-JS中核心类、瓦片地图、物理引擎、音乐音效、数据持久化、网络通信、性能优化、多平台...

    cocos2d-x事件类

    在使用cocos2d-x开发游戏的过程中,为了实现逻辑和显示相分离。 在下通宵了一个晚上,写出了该事件类。 谨记,该事件只能用于cocos2d-x中。 事件发送者需要继承EventDispatcher类 事件接收者需要继承EventHandle类...

    cocos2d入门cocos2d入门

    cocos2d入门 cocos2d入门 cocos2d入门 cocos2d入门 cocos2d入门 cocos2d入门

    cocos2d-x json字符串与cocos2d::Value转换工具

    该资源主要用于cocos2d-x中Value与json字符串的相互转换,提供从json文件读取为cocos2d::Value,cocos2d::Value写入到文件,cocos2d::Value转换为json字符串,json字符串转换为cocos2d::Value。json字符串转换成cocos...

    Cocos2d-x实战 JS卷

    Cocos2d-x实战

    Cocos2D-X核心类学习

    Cocos2D-X核心类 Cocos2D-X 引擎的设计思路是将游戏中的各个部分抽象成几个概念:导演、场景、布景层及人物精灵。 导演(CCDirector):游戏的组织者和领导者,是整个游戏的负责人、总指挥。导演类制定游戏的运行...

    Cocos2D权威指南

    第1章 开始前的准备工作 1 第2章 你的第一款iPhone游戏:垂直射击游戏 38 第3章 Cocos2D核心类 69 第4章 Cocos2D中的动作、特效与动画 152 第5章 Cocos2D中的文本渲染系统 229 共19章

    cocos2d-x-2.1.5

    cocos2d-x-2.1.5

    Cocos2d-x《开心斗地主》棋牌类游戏源码

    cocos2d-x棋牌类游戏《开心斗地主》源码 经典的棋牌类游戏,非常适合二次开发和学习使用 开发环境: Cocos2d-X v2.0

    cocos2d初级教程-Cocos2d SimpleGame源码

    Ray Wenderlich的《Cocos2d SimpleGame》,被认为是cocos2d的初学者最好的教程,这本书被Cocos2D-X团队从objective-c转化到了c++版,并发布在了github上。在此感谢Ray Wenderlich的慷慨相助。 源代码是在cocos2d-x ...

    Cocos2d x手机游戏开发与项目实战详解.part3

    x的核心类CCDirector、CCScene、CCNode、CCLayer、CCSprite、CCAction等,通过案例来介绍Cocos2d-x的场景、图层、交互、动作、动画、粒子效果、游戏地图、物理引擎,并详细介绍了Cocos2d-x 2.2.1版本中所有自带Demo...

    cocos2d-x游戏代码

    cocos2d-x游戏代码

    Cocos2d-x高级开发教程

    Cocos2d-x是移动跨平台开发最流行的游戏引擎,而本书是一本很全面的、比较‘接地气’的游戏开发教程。书中汇聚了热门手机游戏《捕鱼达人》开发的实战经验,作者从最基础的内容开始,逐步深入地介绍了Cocos2d-x的相关...

    Cocos2d-x实战 JS卷 Cocos2d-JS开发

    Cocos2d-x实战 JS卷 Cocos2d-JS开发 PDF 电子书完整版本

    cocos2d-android jar包全套.zip

    如果你想用cocos2d开发android游戏,但是又不方便找包,这里就可以为你提供cocos2d开发的所有相关包,解压后得到libs文件夹即可。

    教你用Cocos2D-X开发跨平台移动应用

    Cocos2d-x源于Cocos2d,是一款开源游戏引擎项目,是一款基于对原有iOS平台cocos2d重写为C++的开源代码,封装了OpenGL,Box2d,LibCurl,LibPng等开源的跨平台代码。由于基于C++和STL特点使其广泛应用于游戏开发、移动...

    cocos2d的学习资料

    cocos2d的学习资料,一本比较经典的cocos2d开发书,适合cocos2d/cocos2d-x的入门

    cocos2d-x实战项目

    cocos2d-x实战项目 01.cocos2d-x原理及环境配置.rar 03.cocostudio使用方法及UI控制.rar 04.XML文件读取与骨骼动画.rarcocos2d-x实战项目 01.cocos2d-x原理及环境配置.rar 03.cocostudio使用方法及UI控制.rar 04.XML...

    大富翁手机游戏开发实战基于Cocos2d-x3.2引擎

    资源名称:大富翁手机游戏开发实战基于Cocos2d-x3.2引擎内容简介:李德国编著的《大富翁手机游戏开发实战(基于 Cocos2d-x3.2引擎)》使用Cocos2d-x游戏引擎技术,带领读者一步一步从零开始进行大富翁移动游戏的开发...

Global site tag (gtag.js) - Google Analytics