Cocos2d-x保存用户游戏数据之XML文件是否存在问题判断方法

所属分类: 软件编程 / C 语言 阅读数: 51
收藏 0 赞 0 分享

之前有写过一篇博客介绍了游戏数据保存类CCUserDefault,主要介绍了几个函数的使用,很是简单,不了解的先看这篇文章。但是在实际做项目的时候发现如何判断XML文件存在是个问题,试想一下用户结束了游戏以后想打开APP继续玩,却发现还得重头玩起,是不是会很失望啊,所以我们必须把用户的数据保存起来,比如最高分、声音的设置什么的。在这个过程中如何判断XML文件就是一个问题,进过我的调试发现使用引擎提供的那个函数不能解决问题,现在采用如下的方法,大家看代码吧。

//数据保存类的头文件
#ifndef _USER_DATA_H_
#define _USER_DATA_H_
#include "cocos2d.h"

using namespace cocos2d;

//这个类同样使用单例设计模式

class UserData
{
public:
	//以下的set和get方法都是用来设置和获取游戏数据的
	bool getMusicValue();
	void setMusicValue(bool b);
	static UserData * sharedUserData();
	//在Appdelegate的析构函数中调用,用来释放m_userData数据成员
	void freeUserData();
private:
	//保存是否播放背景音乐的成员变量
	bool m_musicValue;
	static UserData * m_userData;
	//在构造函数中来进行一些初始化的操作
	UserData();
};

#endif
#include "UserData.h"

//以下为单例设计模式的惯用写法,所有的单例设计模式都类似,大家照着写就行了
UserData * UserData::m_userData = NULL;

UserData * UserData::sharedUserData()
{
	if(m_userData == NULL)
	{
		m_userData = new UserData();
	}

	return m_userData;
}

void UserData::freeUserData()
{
	if(m_userData)
	{
		delete m_userData;
		m_userData = NULL;
	}
}

//在UserData的构造函数中为游戏数据初始化
UserData::UserData()
{

	//不要调用CCUserDefault::sharedUserDefault()->isXMLFileExist()来判断是否存在XML文件,因为当我们调用sharedUserDefalut()的时候
	//系统就会为我们初始化xml文件的,所以如果这么调用的话文件就永远存在了。而使用CCUserDefault::isXMLFileExit()仍然解决不
  //了问题,这个时候无论什么时候启动程序isXMLFileExist()都返回的是假,也就是文件永远不存在了,经过我的调试认为这俩个函数都不能解决问题
	//如果你有其他的发现请留言。这里我采用以下的方法进行处理,直接调用getBoolForKey函数,第二个参数是说如果isExit不存在,则返回的是false
	//这样的话,用户第一次玩游戏的时候返回的是false,在if中会进行一些数据的初始化,并且保持在XML文件中,第二次调用的时候就会执行else了
	//也就是从XML文件中取用户的游戏数据了
	if(!(m_musicValue = CCUserDefault::sharedUserDefault()->getBoolForKey("isExit",false)))
	{
		CCUserDefault::sharedUserDefault()->setBoolForKey("isExit",true);
		//初始化游戏数据,并且保存在XML文件中
		m_musicValue = true;
		CCUserDefault::sharedUserDefault()->setBoolForKey("m_musicValue",m_musicValue);
	}
	else
	{
		m_musicValue = CCUserDefault::sharedUserDefault()->getBoolForKey("m_musicValue");
	}
}

//返回用户的声音数据
bool UserData::getMusicValue()
{
	return this->m_musicValue;
}

//设置用户的声音数据,并且保存在文件中,最后使用flush来刷新近XML文件中
void UserData::setMusicValue(bool b)
{
	this->m_musicValue = b;
	CCUserDefault::sharedUserDefault()->setBoolForKey("m_musicValue",this->m_musicValue);
	//在win32上这个函数的实现是空的
	CCUserDefault::sharedUserDefault()->flush();
}

以上的代码是我写的小例子忍者飞镖中的一个类,现在只是加入了保存声音数据的代码,还在完善其他的一些问题,到时候会写另一篇博客,大家就会看到完整的代码了。

更多精彩内容其他人还在看

详解C++ string字符串类

这篇文章主要介绍了C++ string字符串类,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

C++单例类模板详解

这篇文章主要介绍了C++单例类模板,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

C语言实现数据结构迷宫实验

这篇文章主要为大家详细介绍了C语言实现数据结构迷宫实验,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

C语言数据结构之迷宫问题

这篇文章主要为大家详细介绍了C语言数据结构之迷宫问题,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

C语言数据结构之迷宫求解问题

这篇文章主要为大家详细介绍了C语言数据结构之迷宫求解问题,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

C语言实现小学生考试系统

这篇文章主要为大家详细介绍了C语言实现小学生考试系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

C语言实现小学生随机出题测试计分

这篇文章主要为大家详细介绍了C语言实现小学生随机出题测试计分,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

C语言实现小学生计算机辅助教学系统

这篇文章主要为大家详细介绍了C语言实现小学生计算机辅助教学系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

详解C++中构造函数,拷贝构造函数和赋值函数的区别和实现

这篇文章主要介绍了C++中构造函数,拷贝构造函数和赋值函数的区别和实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

C语言清除scanf()缓存的案例讲解

今天小编就为大家分享一篇关于C语言清除scanf()缓存的案例讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
收藏 0 赞 0 分享
查看更多