UserDefault能夠實現數據的存儲,可是它的使用不能氾濫,具體講通常狀況下不會使用它保存大量的數據,它沒有SQL語句那樣的靈活。UserDefault除了保存遊戲設置外,還有能夠長期保持遊戲精靈等對象的狀態。
咱們經過一個實例介紹一下在遊戲項目中如何使用UserDefault。如圖所示,在Setting場景中能夠設置是否播放背景音樂和音效,如今咱們將它完善將選擇的狀態保存到UserDefault中。
html
設置背景音樂與音效(上圖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頭文件中,示例代碼以下:
spa
[html] view plaincopy.net
#ifndef __HELLOWORLD_SCENE_H__ code
#define __HELLOWORLD_SCENE_H__ orm
#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主要代碼以下:
[html] view plaincopy
#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()主要代碼以下:
[html] view plaincopy
#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中的點擊音效開關菜單代碼以下:
[html] view plaincopy
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中的點擊背景音樂開關菜單代碼以下:
[html] view plaincopy
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中的其它主要代碼以下:
[html] view plaincopy
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
歡迎加入Cocos2d-x技術討論羣:257760386
歡迎關注智捷iOS課堂微信公共平臺