Cocos2d-x使用UserDefault数据持久化实例:保存背景音乐和音效设置

简介: <span style="font-size:14px;">UserDefault可以实现数据的存储,但是它的使用不能泛滥,具体讲一般情况下不会使用它保存大量的数据,它没有SQL语句那样的灵活。UserDefault除了保存游戏设置外,还有可以长期保持游戏精灵等对象的状态。<br><br><br>我们通过一个实例介绍一下在游戏项目中如何使用UserDefault。如图所示,在Setting场景
UserDefault可以实现数据的存储但是它的使用不能泛滥具体讲一般情况下不会使用它保存大量的数据它没有SQL语句那样的灵活。UserDefault除了保存游戏设置外还有可以长期保持游戏精灵等对象的状态。


我们通过一个实例介绍一下在游戏项目中如何使用UserDefault。如图所示在Setting场景中可以设置是否播放背景音乐和音效现在我们将它完善将选择的状态保存到UserDefault中。




设置背景音乐与音效上图HelloWorld场景、下图Setting场景
我们需要定义两个宏作为键其中SOUND_KEY是音效状态键MUSIC_KEY是背景音乐播放状态键。
#define SOUND_KEY "sound_key"
#define MUSIC_KEY "music_key"
但是这两个宏是需要在所有使用cpp文件中使用我们可以创建一个头文件把这些宏等都声明在这个头文件中这个头文件SystemHeader.h代码如下
#include "SimpleAudioEngine.h"
#define SOUND_KEY "sound_key"
#define MUSIC_KEY "music_key"
其中我们声明了两个宏还有包含头文件SimpleAudioEngine.h头文件SimpleAudioEngine.h是文件使用CocosDenshion引擎所需要的。
在Visual Studio 2012中添加SystemHeader.h文件过程是。首先打开解决方案中的HelloWorld工程右键点击Classes在右键菜单中选择“添加”→ “新建项”如图14-8所示。
在弹出对话框中选择“Visual C++ ”→“头文件(.h) ”, 在下面名称中输入“SystemHeader.h”然后点击“添加”按钮添加头文件。


添加SystemHeader.h文件

添加SystemHeader.h文件对话框
在使用的时候我们需要将SystemHeader.h头文件添加到HelloWorldScene.h和SettingScene.h头文件中示例代码如下
#ifndef __HELLOWORLD_SCENE_H__
#define __HELLOWORLD_SCENE_H__


#include "cocos2d.h"
#include "SettingScene.h"
#include "SystemHeader.h"


class HelloWorld : public cocos2d::Layer
{
public:
	… …
	CREATE_FUNC(HelloWorld);
};


#endif // __HELLOWORLD_SCENE_H__


下面我们看看HelloWorld场景HelloWorldScene.cpp主要代码如下
#include "HelloWorldScene.h"


USING_NS_CC;
using namespace CocosDenshion;


bool HelloWorld::init()
{
	... ...
	return true;
}


void HelloWorld::menuItemSettingCallback(Ref* pSender)
{	
	auto sc = Setting::createScene();
	auto reScene = TransitionJumpZoom::create(1.0f, sc);
	Director::getInstance()->pushScene(reScene);


	if (UserDefault::getInstance()->getBoolForKey(SOUND_KEY)) {						①
		SimpleAudioEngine::getInstance()->playEffect("sound/Blip.wav");
	}
}


void HelloWorld::menuItemHelpCallback(Ref* pSender)
{
	MenuItem* item = (MenuItem*)pSender;
	log("Touch Help %p", item);
	if (UserDefault::getInstance()->getBoolForKey(SOUND_KEY)) {						②
		SimpleAudioEngine::getInstance()->playEffect("sound/Blip.wav");
	}
}


void HelloWorld::menuItemStartCallback(Ref* pSender)
{
	MenuItem* item = (MenuItem*)pSender;
	log("Touch Start %p", item);
	if (UserDefault::getInstance()->getBoolForKey(SOUND_KEY)) {						③
		SimpleAudioEngine::getInstance()->playEffect("sound/Blip.wav");
	}
}


void HelloWorld::onEnter()
{
	Layer::onEnter();
	log("HelloWorld onEnter");		
}


void HelloWorld::onEnterTransitionDidFinish()
{
	Layer::onEnterTransitionDidFinish();
	log("HelloWorld onEnterTransitionDidFinish");


	//播放
	if (UserDefault::getInstance()->getBoolForKey(MUSIC_KEY)) {						④
		SimpleAudioEngine::getInstance()->playBackgroundMusic("sound/Jazz.mp3", true);
	}
}


void HelloWorld::onExit()
{
	Layer::onExit();
	log("HelloWorld onExit");
}


void HelloWorld::onExitTransitionDidStart()
{
	Layer::onExitTransitionDidStart();
	log("HelloWorld onExitTransitionDidStart");
}


void HelloWorld::cleanup()
{
	Layer::cleanup();
	log("HelloWorld cleanup");	
	//停止
	SimpleAudioEngine::getInstance()->stopBackgroundMusic("sound/Jazz.mp3");
}


上述第①、②、③行代码中UserDefault::getInstance()->getBoolForKey(SOUND_KEY)是获得sound_key键值通过取出布尔值判断是否播放音效。第④行代码UserDefault::getInstance()->getBoolForKey(MUSIC_KEY)是获得music_key键值通过取出布尔值判断是否播放背景音乐。
下面我们再看看Setting场景SettingScene.cpp中的init()主要代码如下
#include "SettingScene.h"


USING_NS_CC;
using namespace CocosDenshion;


bool Setting::init()
{
	... ...
	UserDefault *defaults  = UserDefault::getInstance();


	if (defaults->getBoolForKey(MUSIC_KEY)) {									①
		musicToggleMenuItem->setSelectedIndex(0);								②
	} else {
		musicToggleMenuItem->setSelectedIndex(1);								③
	}


	if (defaults->getBoolForKey(SOUND_KEY)) {									④
		soundToggleMenuItem->setSelectedIndex(0);								⑤
	} else {
		soundToggleMenuItem->setSelectedIndex(1);								⑥
	}


	return true;
}


上述代码是设置开关菜单的状态第①~③行代码是设置背景音乐开关菜单其中第②行代码是设置开关菜单为Off否则通过第③行代码设置状态为On。第④~⑥行代码是设置音效开关菜单其中第⑤行代码是设置开关菜单为Off否则通过第⑥行代码设置状态为On。
SettingScene.cpp中的点击音效开关菜单代码如下 
void Setting::menuSoundToggleCallback(Ref* pSender)
{
	auto soundToggleMenuItem = (MenuItemToggle*)pSender;
	log("soundToggleMenuItem %d", soundToggleMenuItem->getSelectedIndex());


	UserDefault *defaults  = UserDefault::getInstance();
	if (defaults->getBoolForKey(SOUND_KEY)) {									①
		defaults->setBoolForKey(SOUND_KEY, false);								②
	} else {
		defaults->setBoolForKey(SOUND_KEY, true);								③
		SimpleAudioEngine::getInstance()->playEffect("sound/Blip.wav");					④
	}


}


上述代码第①行判断音效开状态为true情况下通过defaults->setBoolForKey(SOUND_KEY, false)语句设置false否则通过第③行代码defaults->setBoolForKey(SOUND_KEY, true)语句设置true同时通过第④行代码播放音效。
SettingScene.cpp中的点击背景音乐开关菜单代码如下 
void Setting::menuMusicToggleCallback(Ref* pSender)
{
	auto musicToggleMenuItem = (MenuItemToggle*)pSender;
	log("musicToggleMenuItem %d", musicToggleMenuItem->getSelectedIndex());


	UserDefault *defaults  = UserDefault::getInstance();
	if (defaults->getBoolForKey(MUSIC_KEY)) {									①
		defaults->setBoolForKey(MUSIC_KEY, false);
		SimpleAudioEngine::getInstance()->stopBackgroundMusic();
	} else {
		defaults->setBoolForKey(MUSIC_KEY, true);
		SimpleAudioEngine::getInstance()->playBackgroundMusic("sound/Synth.mp3");
	}																			②
}


上述代码第①~②行是设置背景音乐开关菜单。代码与点击音效开关菜单类似不再解释。还有SettingScene.cpp中的其它主要代码如下 
void Setting::onEnter()
{
	Layer::onEnter();
	log("Setting onEnter");
}


void Setting::menuOkCallback(Ref* pSender)									①
{
	Director::getInstance()->popScene();


	if (UserDefault::getInstance()->getBoolForKey(SOUND_KEY)) {						②
		SimpleAudioEngine::getInstance()->playEffect("sound/Blip.wav");
	}
}


void Setting::onEnterTransitionDidFinish()										③
{
	Layer::onEnterTransitionDidFinish();
	log("Setting onEnterTransitionDidFinish");	


	if (UserDefault::getInstance()->getBoolForKey(MUSIC_KEY)) {						④
		//播放
		SimpleAudioEngine::getInstance()->playBackgroundMusic("sound/Synth.mp3", true);
	}


}


void Setting::onExit()
{
	Layer::onExit();
	log("Setting onExit");	
}


void Setting::onExitTransitionDidStart()
{
	Layer::onExitTransitionDidStart();
	log("Setting onExitTransitionDidStart");
}


void Setting::cleanup()
{
	Layer::cleanup();
	log("Setting cleanup");	
	//停止
	SimpleAudioEngine::getInstance()->stopBackgroundMusic("sound/Synth.mp3");
}


上述代码第①行menuOkCallback是点击Ok菜单回调函数其中第②行代码是获得sound_key键值通过取出布尔值判断是否播放音效。第③行代码onEnterTransitionDidFinish函数是在进入层而且过渡动画结束时候调用第④行代码是获得music_key键值通过取出布尔值判断是否播放背景音乐。

我们可以运行一下先将状态保存然后重新运行游戏看看是否能够保持状态。我们还可以到<Cocos2d-x工程目录>\proj.win32\Debug.win32目录下看看是否成功生成了UserDefault.xml文件。


更多内容请关注最新Cocos图书《Cocos2d-x实战 C++卷》
本书交流讨论网站 http://www.cocoagame.net
更多精彩视频课程请关注智捷课堂Cocos课程 http://v.51work6.com
欢迎加入Cocos2d-x技术讨论群257760386


《Cocos2d-x实战 C++卷》现已上线各大商店均已开售

京东http://item.jd.com/11584534.html

亚马逊http://www.amazon.cn/Cocos2d-x%E5%AE%9E%E6%88%98-C-%E5%8D%B7-%E5%85%B3%E4%B8%9C%E5%8D%87/dp/B00PTYWTLU

当当http://product.dangdang.com/23606265.html

互动出版网http://product.china-pub.com/3770734

《Cocos2d-x实战 C++卷》源码及样章下载地址

源码下载地址http://51work6.com/forum.php?mod=viewthread&tid=1155&extra=page%3D1 

样章下载地址http://51work6.com/forum.php?mod=viewthread&tid=1157&extra=page%3D1

欢迎关注智捷iOS课堂微信公共平台
目录
相关文章
|
7月前
|
图形学
|
API 图形学
Unity设置播放模式下始终先执行指定的场景
通过我们使用Unity开发游戏,是在PC/Mac上。而一个游戏通常也会有很多的场景,比如A、B、C、D三个场景,正常流程下的执行顺序是 A –> B –> C –> D。在具体一点,比如 A —— 启动场景、B —— 资源加载场景、C —— 登录场景、D —— 战斗场景。
1587 0
uniapp视频数组,点击播放-播放当前视频,其余暂停demo效果(整理)
uniapp视频数组,点击播放-播放当前视频,其余暂停demo效果(整理)
|
8月前
|
小程序 API
小程序背景音乐及音频播放demo(copy直接使用~)
小程序背景音乐及音频播放demo(copy直接使用~)
131 0
小程序背景音乐及音频播放demo(copy直接使用~)
|
存储 编解码 计算机视觉
项目实战:Qt+OpenCV视频播放器(支持播放器操作,如暂停、恢复、停止、时间、进度条拽托等)
项目实战:Qt+OpenCV视频播放器(支持播放器操作,如暂停、恢复、停止、时间、进度条拽托等)
项目实战:Qt+OpenCV视频播放器(支持播放器操作,如暂停、恢复、停止、时间、进度条拽托等)
关于 qml开发中使用Image元素切换图片闪黑屏 的解决方法
关于 qml开发中使用Image元素切换图片闪黑屏 的解决方法
关于 qml开发中使用Image元素切换图片闪黑屏 的解决方法
|
Android开发 内存技术
【Android FFMPEG 开发】OpenSLES 播放音频 ( 创建引擎 | 输出混音设置 | 配置输入输出 | 创建播放器 | 获取播放/队列接口 | 回调函数 | 开始播放 | 激活回调 )(二)
【Android FFMPEG 开发】OpenSLES 播放音频 ( 创建引擎 | 输出混音设置 | 配置输入输出 | 创建播放器 | 获取播放/队列接口 | 回调函数 | 开始播放 | 激活回调 )(二)
297 0
|
存储 编解码 Java
【Android FFMPEG 开发】OpenSLES 播放音频 ( 创建引擎 | 输出混音设置 | 配置输入输出 | 创建播放器 | 获取播放/队列接口 | 回调函数 | 开始播放 | 激活回调 )(一)
【Android FFMPEG 开发】OpenSLES 播放音频 ( 创建引擎 | 输出混音设置 | 配置输入输出 | 创建播放器 | 获取播放/队列接口 | 回调函数 | 开始播放 | 激活回调 )(一)
285 0
阿里云 Aliplayer高级功能介绍(六):进度条标记
基本介绍 Aliplayer在进度条上提示时间和缩略图功能外,还可以进行视频内容的提示打点,当然不止是进度条上显示打点的内容,还提供一组接口,方便用户进行打点时间和内容的获取, 基本UI如下图所示: 接口和属性介绍 播放器提供了progressMarkers属性,是一个数组类型,每一条记录包含o.
12889 0
几种播放视频文件的方式
几种播放视频文件的方式(一) —— 总结播放视频的几种方式(一)几种播放视频文件的方式(二) —— 基于MediaPlayer框架的视频播放(一)几种播放视频文件的方式(三) —— 基于AVFoundation框架视频播放(一)几种播放视频文件的方式(...
1130 0