玩家要保存的数据可能很多,这里,我们只保存分数
这个类的成员变量和函数如下
//用户数据操作的成员变量 UserDefault * m_userDefault; //要用到这种特殊的容器了。。 ValueVector m_vector; //记录玩家的当前分数 CC_SYNTHESIZE(int, m_score, Score); void save();
我们使用cocos2d-x提供的UserDefault类来实现数据保存功能
对于UserDefault类,我也不太熟悉,主要是参考官方文档和网上的例子来做的,不过基本思路还算清晰
bool SaveData::init() { m_userDefault = UserDefault::getInstance(); m_vector = ValueVector(); m_score = 0; //每玩一次游戏,分数的记录条数就会加一 m_userDefault->setIntegerForKey("count", (m_userDefault->getIntegerForKey("count", 0)) + 1); //首先判断XML文件是否存在,如果不存在的话就会执行if中的语句 if (m_userDefault->getBoolForKey("isExit", false) == false) { //玩家初次玩游戏会执行这里 m_userDefault->setBoolForKey("isExit", true); } else { //将分数记录保存在vector集合中 for (int i = 0; i < m_userDefault->getIntegerForKey("count") - 1; i++) { __String * index = String::createWithFormat("%d", i); //将要放的数据使用Value包装一下 m_vector.push_back(Value(m_userDefault->getIntegerForKey(index->getCString()))); } } return true; } void SaveData::save() { /*本函数的整体思路是先对vector中保存的玩家数据进行排序,然后重新写入到xml文件中*/ //将玩家的分数保存到set集合中,以便排序,分数和原先的分数不同才保存 int i = 0; for (auto tem : m_vector) { if (tem.asInt() == m_score) { break; } i++; } if (i == m_vector.size()) { m_vector.push_back(Value(m_score)); //自定义排序函数,对m_vector中的内容进行排序,方便以后对数据的操作 auto sortData = [](Value value1, Value value2) { return value1.asInt() > value2.asInt(); }; //调用c++模板中的sort函数进行排序,前俩个参数是数组的地址,最后一个参数是使用的排序函数 std::sort(m_vector.begin(), m_vector.end(), sortData); //将玩家的得分保存在文件中 for (int i = 0; i < m_vector.size(); i++) { auto value = m_vector.at(i); auto index = __String::createWithFormat("%d", i); m_userDefault->setIntegerForKey(index->getCString(), value.asInt()); } } //单独保存本次游戏的得分 UserDefault::getInstance()->setIntegerForKey("currentScore", m_score); //重新设置一下count UserDefault::getInstance()->setIntegerForKey("count", m_vector.size()); //刷新 m_userDefault->flush(); }