cocos2d-x中保存用户游戏数据CCUserDefault

正在做项目中有很多游戏数据要保存,常见的玩家数据这些比较简单的可以用CCUserDefault。它是cocos2d-x用来存取基本数据类型用的。保存为XML文件格式。

主要方法:(和java的map很像,键值对,应该很容易懂的)

[cpp]

 

void    setBoolForKey(const char* pKey, bool value);
void    setIntegerForKey(const char* pKey, int value);
void    setFloatForKey(const char* pKey, float value);
void    setDoubleForKey(const char* pKey, double value);
void    setStringForKey(const char* pKey, const std::string & value);


通过键读取数据,如果键不存在,可以设置一个defaultValue返回自己想要的值。

[cpp]
bool    getBoolForKey(const char* pKey, bool defaultValue = false);
int    getIntegerForKey(const char* pKey, int defaultValue = 0);
float    getFloatForKey(const char* pKey, float defaultValue=0.0f);
double    getDoubleForKey(const char* pKey, double defaultValue=0.0);
std::string    getStringForKey(const char* pKey, const std::string & defaultValue = "");


首次运行程序时可以去生成xml文件CCUserDefault::sharedUserDefault()->setIntegerForKey("MyGold", 0);

这样就可以生成一个xml文件。不过这种硬代码我不是很喜欢。

 

每次调用的时候要写很长的代码。可以建议搞几个宏,毕竟CCUserDefault的get,set实在太长了。

[cpp]
#define SaveStringToXML CCUserDefault::sharedUserDefault()->setStringForKey

#define SaveIntegerToXML CCUserDefault::sharedUserDefault()->setIntegerForKey

#define SaveBooleanToXML CCUserDefault::sharedUserDefault()->setBoolForKey

#define LoadStringFromXML CCUserDefault::sharedUserDefault()->getStringForKey

#define LoadIntegerFromXML CCUserDefault::sharedUserDefault()->getIntegerForKey

#define LoadBooleanFromXML CCUserDefault::sharedUserDefault()->getBoolForKey


如何首次生成判断文件是否存在呢

其实可以利用get方法去获取。

[cpp]
       if ( !LoadBooleanFromXML("_IS_EXISTED")) 

       {

              initUserData();             

              SaveBooleanToXML("_IS_EXISTED", true);

       }


对了,ccUserDefault在0.9.1版本会在安卓平台下crash掉,更新源代码就OK了

 

 

 

 

 

CCUserDefault 游戏数据保存和加载

 

      CCUSerDefault是在cocos2d-X框架之中用于存储轻量级的用户数据而准备的,存放在本地的文件之中,是一个xml文件类型。

        开发环境为Mac,编译环境为XCode,游戏引擎为Cocos2d-X。

        因为刚刚从object-c转过来,真实感受到苹果的封装远远比C++好用多了。单单从#import和 #include去区分就可以看的出来,习惯了#import,看到这个#include

就好纠结啊。再者就是C++的命名空间啊,一开始忘了使用

usingnamespacecocos2d;

结果导致我使用ccuserDefault半天出不来提示,纠结我半天。

        首先,先把所需的头文件引入,并且添加命名空间。

  1. #include "MainScene.h"  
  2. #include "SimpleAudioEngine.h"  
  3. #include <CCData.h>  
  4. #include <CCUserDefault.h>  
  5. #include <curl.h>  
  6. using namespace cocos2d;  
  7. using namespace CocosDenshion;  
  8. using namespace std;  

 

 

这个CCUSerDefault可以操作的数据类型有int,double,float,string,bool。有一对set和get方法。这里只是演示string,其他的自己去测试。

 

 

  1. //初始化开始的主场景  
  2. bool MainScene::init()  
  3. {  
  4.     if (!CCLayer::init()) {  
  5.         return false;  
  6.     }  
  7.       
  8.     //test  
  9.       
  10.     CCUserDefault::sharedUserDefault()->setStringForKey("userName","西门吹雪");  
  11.     string userName = CCUserDefault::sharedUserDefault()->getStringForKey("userName");  
  12.     //userName.c_str(),c_str()这个方法是返回字符串的首地址  
  13.     CCLOG("*****userName %s",userName.c_str());  
  14.   
  15.     //CCUserDefault::sharedUserDefault()->flush();  
  16.     CCUserDefault::sharedUserDefault()->setStringForKey("userName","火云邪神");  
  17.     //flush()方法是将操作的数据存写到本地的xml文件里面,下次你可以访问取出  
  18.     CCUserDefault::sharedUserDefault()->flush();  
  19.     userName = CCUserDefault::sharedUserDefault()->getStringForKey("userName");  
  20.     CCLOG("*****userName %s",userName.c_str());   }  
  

这里贴出输出结果:



当我现在把set方法注释掉后,依然可以直接从本地的xml文件取出数据,但是只能取出火云邪神的,不能取出西门吹雪。因为火云邪神调用 flush()方法将数据从内存中的栈区取出,写到了本地磁盘。把结果贴图加上:

 

 

这里通过 CCUserdefault:: getXMLFilePath()方法取出xml文件的默认地址:

  1. std::string fileName = CCUserDefault::getXMLFilePath();  

输出地址:
  1. Cocos2d: fileName  /Users/liyongjian/Library/Application Support/iPhone Simulator/6.1/Applications/A8E7758F-8B67-4B34-9CA1-4C0712016182/Library/Caches/UserDefault.xml  

然后我去这个地址下看了看,发现找不到 UserDefault.xml  这个文件,但是看到了这个

我的存储内容在这个plist文件里面。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值