正在做项目中有很多游戏数据要保存,常见的玩家数据这些比较简单的可以用CCUserDefault。它是cocos2d-x用来存取基本数据类型用的。保存为XML文件格式。
主要方法:(和java的map很像,键值对,应该很容易懂的)
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返回自己想要的值。
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实在太长了。
#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方法去获取。
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半天出不来提示,纠结我半天。首先,先把所需的头文件引入,并且添加命名空间。
- #include "MainScene.h"
- #include "SimpleAudioEngine.h"
- #include <CCData.h>
- #include <CCUserDefault.h>
- #include <curl.h>
- using namespace cocos2d;
- using namespace CocosDenshion;
- using namespace std;
这个CCUSerDefault可以操作的数据类型有int,double,float,string,bool。有一对set和get方法。这里只是演示string,其他的自己去测试。
- //初始化开始的主场景
- bool MainScene::init()
- {
- if (!CCLayer::init()) {
- return false;
- }
- //test
- CCUserDefault::sharedUserDefault()->setStringForKey("userName","西门吹雪");
- string userName = CCUserDefault::sharedUserDefault()->getStringForKey("userName");
- //userName.c_str(),c_str()这个方法是返回字符串的首地址
- CCLOG("*****userName %s",userName.c_str());
- //CCUserDefault::sharedUserDefault()->flush();
- CCUserDefault::sharedUserDefault()->setStringForKey("userName","火云邪神");
- //flush()方法是将操作的数据存写到本地的xml文件里面,下次你可以访问取出
- CCUserDefault::sharedUserDefault()->flush();
- userName = CCUserDefault::sharedUserDefault()->getStringForKey("userName");
- CCLOG("*****userName %s",userName.c_str()); }
这里贴出输出结果:
当我现在把set方法注释掉后,依然可以直接从本地的xml文件取出数据,但是只能取出火云邪神的,不能取出西门吹雪。因为火云邪神调用 flush()方法将数据从内存中的栈区取出,写到了本地磁盘。把结果贴图加上:
这里通过 CCUserdefault:: getXMLFilePath()方法取出xml文件的默认地址:
- std::string fileName = CCUserDefault::getXMLFilePath();
输出地址:
- Cocos2d: fileName /Users/liyongjian/Library/Application Support/iPhone Simulator/6.1/Applications/A8E7758F-8B67-4B34-9CA1-4C0712016182/Library/Caches/UserDefault.xml
然后我去这个地址下看了看,发现找不到 UserDefault.xml 这个文件,但是看到了这个
我的存储内容在这个plist文件里面。