玩家要保存的數據可能很多,這里,我們只保存分數
這個類的成員變量和函數如下
~~~
//用戶數據操作的成員變量
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();
}
~~~