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语言socket多线程编程限制客户端连接数

    c语言socket多线程编程限制客户端连接数

    这篇文章主要介绍了c语言socket多线程编程,可以限制客户端连接数,大家参考使用吧
    2013-12-12
  • c语言求出给定范围内的所有质数

    c语言求出给定范围内的所有质数

    本文主要介绍了c语言求出给定范围内的所有质数的小程序。具有很好的参考价值。下面跟着小编一起来看下吧
    2017-04-04
  • C++中putchar与getchar函数的细节及运用

    C++中putchar与getchar函数的细节及运用

    C语言提供putchar函数,用于给终端输出一个字符;getchar函数,可以从终端接收用户输入的一个字符,本文给大家分享C++中putchar与getchar函数的细节及运用,感兴趣的朋友跟随小编一起看看吧
    2021-07-07
  • 详解C++的反调试技术与绕过手法

    详解C++的反调试技术与绕过手法

    反调试技术,恶意代码会用它识别自身是否被调试,或者让调试器失效,给反病毒工程师们制造麻烦,拉长提取特征码的时间线,本章将具体总结常见的反调试基础的实现原理以及如何过掉这些反调试手段,从而让我们能够继续分析恶意代码
    2021-06-06
  • C++虚函数的实现机制分析

    C++虚函数的实现机制分析

    这篇文章主要介绍了C++虚函数的实现机制分析,需要的朋友可以参考下
    2014-07-07
  • C++11用两个线程轮流打印整数的实现方法

    C++11用两个线程轮流打印整数的实现方法

    这篇文章主要介绍了C++11用两个线程轮流打印整数的实现方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • C++中临时对象的常见产生情况及其解决的方案

    C++中临时对象的常见产生情况及其解决的方案

    这篇文章主要是探讨常见的临时对象产生的情况,及其如何避免和解决这种临时对象产生的方式。具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • C/C++函数指针深入探究

    C/C++函数指针深入探究

    函数指针是一个指针变量,它可以存储函数的地址,然后使用函数指针,下面这篇文章主要给大家介绍了关于C语言进阶教程之函数指针的相关资料,需要的朋友可以参考下
    2022-08-08
  • c++通过引用实现三个数字求最大值

    c++通过引用实现三个数字求最大值

    下面我们将通过这个例子来说明引用的作为函数参数的使用方法。需要的朋友可以过来参考下,希望对大家有所帮助
    2013-10-10
  • C语言 栈的表示和实现详细介绍

    C语言 栈的表示和实现详细介绍

    这篇文章主要介绍了C语言 栈的表示和实现详细介绍的相关资料,需要的朋友可以参考下
    2016-12-12

最新评论