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

所属分类: 软件编程 / C 语言 阅读数: 67
收藏 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语言来求最大连续子序列乘积的方法

这篇文章主要介绍了利用C语言来求最大连续子序列乘积的方法,基本的思路以外文中还附有相关ACM题目,需要的朋友可以参考下
收藏 0 赞 0 分享

用C语言判断一个二叉树是否为另一个的子结构

这篇文章主要介绍了用C语言判断一个二叉树是否为另一个的子结构,是数据结构学习当中的基础知识,需要的朋友可以参考下
收藏 0 赞 0 分享

C语言实现的阶乘,排列和组合实例

这篇文章主要介绍了C语言实现的阶乘,排列和组合的方法,涉及C语言数学运算的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C语言查找数组里数字重复次数的方法

这篇文章主要介绍了C语言查找数组里数字重复次数的方法,涉及C语言针对数组的遍历与判断技巧,具有一定参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C语言简单实现计算字符个数的方法

这篇文章主要介绍了C语言简单实现计算字符个数的方法,涉及C语言针对字符串的简单遍历与判定技巧,具有一定参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

c实现linux下的数据库备份

本文给大家简单介绍下c实现linux下的数据库备份的方法和具体的源码,十分的实用,有需要的小伙伴可以参考下。
收藏 0 赞 0 分享

C++获得文件状态信息的方法

这篇文章主要介绍了C++获得文件状态信息的方法,包括文件状态信息、文件所在磁盘盘符、文件创建时间、访问时间及修改日期等,需要的朋友可以参考下
收藏 0 赞 0 分享

C语言按关键字搜索文件夹中文件的方法

这篇文章主要介绍了C语言按关键字搜索文件夹中文件的方法,涉及C语言文件操作及字符串查找的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C语言之字符串模糊查询方法的实现

本篇文章主要为大家介绍字符串模糊查询的C语言程序编写方法,有需要的朋友可以参考下
收藏 0 赞 0 分享

C语言实现BMP转换JPG的方法

这篇文章主要介绍了C语言实现BMP转换JPG的方法,涉及C#图片格式转换的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多