【cocos2d-x 3.7 飞机大战】 决战南海I (六) 保存玩家数据

        玩家要保存的数据可能很多,这里,我们只保存分数

这个类的成员变量和函数如下

//用户数据操作的成员变量
	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();
}


你可能感兴趣的:(cocos2d-x,游戏开发)