首页 > 代码库 > Cocos2d-x使用UserDefault数据持久化实例:保存背景音乐和音效设置
Cocos2d-x使用UserDefault数据持久化实例:保存背景音乐和音效设置
UserDefault可以实现数据的存储,但是它的使用不能泛滥,具体讲一般情况下不会使用它保存大量的数据,它没有SQL语句那样的灵活。UserDefault除了保存游戏设置外,还有可以长期保持游戏精灵等对象的状态。
我们通过一个实例介绍一下在游戏项目中如何使用UserDefault。如图所示,在Setting场景中可以设置是否播放背景音乐和音效,现在我们将它完善将选择的状态保存到UserDefault中。
#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”,然后点击“添加”按钮,添加头文件。
下面我们看看HelloWorld场景HelloWorldScene.cpp主要代码如下:
上述第①、②、③行代码中UserDefault::getInstance()->getBoolForKey(SOUND_KEY)是获得sound_key键值,通过取出布尔值判断是否播放音效。第④行代码UserDefault::getInstance()->getBoolForKey(MUSIC_KEY)是获得music_key键值,通过取出布尔值判断是否播放背景音乐。
下面我们再看看Setting场景SettingScene.cpp中的init()主要代码如下:
上述代码是设置开关菜单的状态,第①~③行代码是设置背景音乐开关菜单,其中第②行代码是设置开关菜单为Off,否则通过第③行代码设置状态为On。第④~⑥行代码是设置音效开关菜单,其中第⑤行代码是设置开关菜单为Off,否则通过第⑥行代码设置状态为On。
SettingScene.cpp中的点击音效开关菜单代码如下:
上述代码第①行判断音效开状态为true情况下,通过defaults->setBoolForKey(SOUND_KEY, false)语句设置false,否则通过第③行代码defaults->setBoolForKey(SOUND_KEY, true)语句设置true,同时通过第④行代码播放音效。
SettingScene.cpp中的点击背景音乐开关菜单代码如下:
上述代码第①~②行是设置背景音乐开关菜单。代码与点击音效开关菜单类似,不再解释。还有SettingScene.cpp中的其它主要代码如下:
上述代码第①行menuOkCallback是点击Ok菜单回调函数,其中第②行代码是获得sound_key键值,通过取出布尔值判断是否播放音效。第③行代码onEnterTransitionDidFinish函数是在进入层而且过渡动画结束时候调用,第④行代码是获得music_key键值,通过取出布尔值判断是否播放背景音乐。
我们通过一个实例介绍一下在游戏项目中如何使用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文件。
更多内容请关注国内第一本Cocos2d-x 3.2版本图书《Cocos2d-x实战:C++卷》
本书交流讨论网站:http://www.cocoagame.net
更多精彩视频课程请关注智捷课堂Cocos课程:http://v.51work6.com
更多精彩视频课程请关注智捷课堂Cocos课程:http://v.51w
欢迎加入Cocos2d-x技术讨论群:257760386
欢迎关注智捷iOS课堂微信公共平台
Cocos2d-x使用UserDefault数据持久化实例:保存背景音乐和音效设置
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。