本站文章均为李华明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();
string str= "wahaha" ;
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(667 字节, 1 次)
分享到:
相关推荐
Cocos2d-x-3.x游戏开发之旅-钟迪龙著 全新pdf版和附书代码(代码为工程文件,可复制) 附带目录标签
【iOS-Cocos2d游戏开发】Cocos2d-iPhone动作Action-扩展动作 http://blog.csdn.net/tt5267621/article/details/7626450
quick-cocos2d-x v3 是在 cocos2dx 3.x 的最新版本基础之上,移植了原来 quick-cocos2d-x 的核心框架、强大的 player 、丰富的示例等,并增加更多新的功能。 GitHub: https://github.com/dualface/v3quick
Cocos2d-x 3.x游戏开发实战pdf含目录,内容详细,强烈推荐给大家。
4、【cocos2d-x IOS游戏开发-捕鱼达人4】基本游戏框架 资源引用页: 5、【cocos2d-x IOS游戏开发-捕鱼达人5】C++中函数代理与信号插槽机制 资源引用页: 6、【cocos2d-x IOS游戏开发-捕鱼达人6】实现开始菜单 资源...
【iOS-Cocos2d游戏开发】Cocos2d-iPhone动作Action-瞬时动作 http://blog.csdn.net/tt5267621/article/details/7624781
资源名称:大富翁手机游戏开发实战基于Cocos2d-x3.2引擎内容简介:李德国编著的《大富翁手机游戏开发实战(基于 Cocos2d-x3.2引擎)》使用Cocos2d-x游戏引擎技术,带领读者一步一步从零开始进行大富翁移动游戏的开发...
Mac-OS-X-配置-Cocos2d-x-开发环境(iOS-和-Android).doc
cn.cocos2d-x.org上quick-cocos2d-x初学者教程的代码与资源。原始资源100多M,这个仅保留资源与代码,不包含quick 3.3 Final的框架代码。下载后可以用quick 3.3 player直接玩。
资源名称:Cocos2D-X游戏开发技术精解内容简介:Cocos2D-X是一款支持多平台的 2D手机游戏引擎,支持iOS、Android、BlackBerry等众多平台。当前,很多移动平台流行的游戏,都是基于Cocos2D-X开发的。 《Cocos2D-X...
Cocos2d-x项目实战-射击类游戏-迷失航线,版本是Cocos2d-x-3.2
Cocos2d-x 3.x游戏开发之旅教程及完整源码下载,使用最新cocos2d-x-3.14版本,在xcode7.3上已编译通过。 解决相关问题 1、解决源程序在高版本上无法编译问题 2、解决源程序中文注释部分,xcode上显示乱码问题 使用...
精通COCOS2D-X游戏开发 精通COCOS2D-X游戏开发 精通COCOS2D-X游戏开发 精通COCOS2D-X游戏开发 精通COCOS2D-X游戏开发
iOS实例开发源码——iliu-ios-cocos2d-viking-cba07f8.zip
【iOS-Cocos2d游戏开发】Cocos2d-iPhone动作Action-组合动作 http://blog.csdn.net/tt5267621/article/details/7626137
9、【cocos2d-x IOS游戏开发-捕鱼达人9】鱼与动画 资源引用页: 10、【cocos2d-x IOS游戏开发-捕鱼达人10】鱼的产生和移动 资源引用页: 11、【cocos2d-x IOS游戏开发-捕鱼达人11】鱼的产生和移动:完善 资源引用页...
iOS游戏应用源代码——iliu-ios-cocos2d-viking-cba07f8.zip
Cocos2d-x游戏开发之CCUserDefault类存储详解博客链接 http://blog.csdn.net/cjsen/article/details/9059257
本书是《Cocos2d-x 游戏开发之旅》的升级版,修改了2.0版进阶到3.0版后的一些内容,新增了对CocoStudio、UI编辑器、Cocos2d-x 3.0新特性以及网络方面的知识点。主要介绍常用的API使用方式;介绍如何通过官方Demo获取...
Cocos2d-x 3.X游戏开发实战 (肖文吉) 完整pdfCocos2d-x 3.X游戏开发实战 (肖文吉) 完整pdfCocos2d-x 3.X游戏开发实战 (肖文吉) 完整pdf