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

 更新时间:2014年09月12日 09:53:26   作者:皂荚花  
这篇文章主要介绍了Cocos2d-x保存用户游戏数据之XML文件是否存在问题判断方法,请注意代码中包含大量注释,需要的朋友可以参考下

之前有写过一篇博客介绍了游戏数据保存类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语言中的字符串和内存函数

    本文主要带大家来学习一些常用的库函数。有了这些库函数,我们可以更加方便地操作字符串和内存,从而提升我们的编码效率。话不多说,我们开始吧
    2022-11-11
  • C++的拷贝构造函数你了解吗

    C++的拷贝构造函数你了解吗

    这篇文章主要为大家详细介绍了C++的拷贝构造函数,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • C++实现defer声明方法详解

    C++实现defer声明方法详解

    这篇文章主要介绍了C++实现defer声明,在和朋友交谈时候,无意间了解到Go语言的defer,发现挺有意思的。和智能指针类似,当出了作用域后,被defer修饰的操作才会执行
    2022-11-11
  • C++联合体union用法实例详解

    C++联合体union用法实例详解

    这篇文章主要介绍了C++联合体union用法,较为详细的分析了C++中联合体的概念、实用技巧及相关注意事项,需要的朋友可以参考下
    2015-05-05
  • 数组指针、指针数组以及二位数组的深入解析

    数组指针、指针数组以及二位数组的深入解析

    下面来讲讲多维数组与指针的关系。与普通数组一样,使用多维数组时,实际上将其自动转换为指向该数组第一个元素的指针
    2013-09-09
  • c++ class中成员与分配内存的问题详解

    c++ class中成员与分配内存的问题详解

    很多人都知道C++类是由结构体发展得来的,所以他们的成员变量(C语言的结构体只有成员变量)的内存分配机制是一样的,下面这篇文章主要给大家介绍了关于c++ class中成员与分配内存问题的相关资料,需要的朋友可以参考下
    2021-10-10
  • C++实现十大排序算法及排序算法常见问题

    C++实现十大排序算法及排序算法常见问题

    法是程序的灵魂,无论学习什么语言,做什么工程项目,都要考虑算法的效率实现,下面这篇文章主要给大家介绍了关于C++实现十大排序算法及排序算法常见问题的相关资料,需要的朋友可以参考下
    2021-09-09
  • C语言全面细致精讲操作符的使用

    C语言全面细致精讲操作符的使用

    C 语言提供了丰富的操作符,有:算术操作符,移位操作符,位操作符,赋值操作符,单目操作符,关系操作符,逻辑操作符,条件操作符等。接下了让我们详细了解掌握它
    2022-05-05
  • C++类和对象之类的6个默认成员函数详解

    C++类和对象之类的6个默认成员函数详解

    类是对某一事物的抽象描述,具体地讲类是C++中的一种构造的数据类型,下面这篇文章主要给大家介绍了关于C++类和对象之类的6个默认成员函数的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-02-02
  • VC创建进程CreateProcess的方法

    VC创建进程CreateProcess的方法

    这篇文章主要介绍了VC创建进程CreateProcess的方法,涉及VC操作进程的基本技巧,需要的朋友可以参考下
    2015-05-05

最新评论