今天终于需要用到保存数据了,大家都知道Cocos2dx是OC的C++版本,所以也同样实现了UserDefault,可以使用它来保存一下游戏数据。
这个单例类实现了对基本数据类型的本地化存储,写的时候是将数据写到XML文件中,读是通过XML文件建立一个哈希表,然后通过key取值~
UserDefault的Getter和Setter使用起来都很简单,就不累赘了。
进入正题:
游戏中用到一个数组,需要保存起来,每次打开都从本地读取。但是UserDefault只支持对基础数据类型做存储(有个setDataForKey,搜了一下,只知道是保存二进制值,没有人用过),只能直接写了~
首先想到Value这个类可以进行基础数据类型的转换,例如:Value("123").asInt() 就可以得到123,于是就把数组改写成ValueVector(存放Value的Vector)。
写成一个单例类:
DataCenter.h
#include "cocos2d.h"
USING_NS_CC;
class DataCenter
{
public:
static DataCenter *getInstance();
void setValueVectorForKey(ValueVector &vector,const char *key);
ValueVector getValueVectorByKey(const char *key);
private:
static DataCenter *_dataCenter;
};
"DataCenter.cpp"
#include "DataCenter.h"
#include "string.h"
#define splite '|'
DataCenter * DataCenter ::_dataCenter = nullptr;
DataCenter* DataCenter::getInstance()
{
if (! _dataCenter)
{
_dataCenter = new DataCenter();
}
return _dataCenter;
}
void DataCenter::setValueVectorForKey(ValueVector &vector,const char *key)
{
std::string valueString = "";
for (int i = 0; i < vector.size(); i++) {
valueString = valueString + vector.at(i).asString();
if (i != vector.size() - 1) {
valueString += splite;
}
}
UserDefault::getInstance() -> setStringForKey(key,valueString);
}
ValueVector DataCenter::getValueVectorByKey(const char * key)
{
ValueVector valueVector;
std::string valueString = UserDefault::getInstance() -> getStringForKey(key);
std::string::iterator i;
std::string tmp = "";
for(i = valueString.begin(); i <= valueString.end(); ++i) {
if((const char)*i != splite && i != valueString.end()) {
tmp += *i;
} else {
valueVector.push_back(Value(tmp));
tmp = "";
}
}
return valueVector;
}
实现方法:
- 写,遍历数组,拼成一个字符串存起来,使用UserDefault保存起来
- 读,通过UserDefault读取字符串,把字符串分割成一个数组
使用方法很简单,就不写测试了...
欢迎访问我的博客:helkyle.tk
原文链接:https://www.f2er.com/cocos2dx/345266.html