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

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

概述UserDefault可以实现数据的存储,但是它的使用不能泛滥,具体讲一般情况下不会使用它保存大量的数据,它没有SQL语句那样的灵活。UserDefault除了保存游戏设置外,还有可以长期保持游戏精灵等对象的状态。 我们通过一个实例介绍一下在游戏项目中如何使用UserDefault。如图所示,在Setting场景中可以设置是否播放背景音乐和音效,现在我们将它完善将选择的状态保存到UserDefau 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所示。
在d出对话框中选择“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课堂微信公共平台 总结

以上是内存溢出为你收集整理的Cocos2d-x使用UserDefault数据持久化实例:保存背景音乐和音效设置全部内容,希望文章能够帮你解决Cocos2d-x使用UserDefault数据持久化实例:保存背景音乐和音效设置所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1004652.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存