首页 > 代码库 > 【cocos2d-x】UserDefault保存数组(ValueVector)

【cocos2d-x】UserDefault保存数组(ValueVector)

今天终于需要用到保存数据了,大家都知道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

【cocos2d-x】UserDefault保存数组(ValueVector)