Cocos2d-x使用UserDefault數據持久化實例:保存背景音樂和音效設置

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在CODE上查看代碼片派生到個人代碼片.net

  1. #ifndef __HELLOWORLD_SCENE_H__  code

  2. #define __HELLOWORLD_SCENE_H__  orm

  3.   

  4.   

  5. #include "cocos2d.h"  視頻

  6. #include "SettingScene.h"  

  7. #include "SystemHeader.h"  

  8.   

  9.   

  10. class HelloWorld : public cocos2d::Layer  

  11. {  

  12. public:  

  13.     … …  

  14.     CREATE_FUNC(HelloWorld);  

  15. };  

  16.   

  17.   

  18. #endif // __HELLOWORLD_SCENE_H__  



下面咱們看看HelloWorld場景HelloWorldScene.cpp主要代碼以下:

[html] view plaincopy在CODE上查看代碼片派生到個人代碼片

  1. #include "HelloWorldScene.h"  

  2.   

  3.   

  4. USING_NS_CC;  

  5. using namespace CocosDenshion;  

  6.   

  7.   

  8. bool HelloWorld::init()  

  9. {  

  10.     ... ...  

  11.     return true;  

  12. }  

  13.   

  14.   

  15. void HelloWorld::menuItemSettingCallback(Ref* pSender)  

  16. {     

  17.     auto sc = Setting::createScene();  

  18.     auto reScene = TransitionJumpZoom::create(1.0f, sc);  

  19.     Director::getInstance()->pushScene(reScene);  

  20.   

  21.   

  22.     if (UserDefault::getInstance()->getBoolForKey(SOUND_KEY)) {                      ①  

  23.         SimpleAudioEngine::getInstance()->playEffect("sound/Blip.wav");  

  24.     }  

  25. }  

  26.   

  27.   

  28. void HelloWorld::menuItemHelpCallback(Ref* pSender)  

  29. {  

  30.     MenuItem* item = (MenuItem*)pSender;  

  31.     log("Touch Help %p", item);  

  32.     if (UserDefault::getInstance()->getBoolForKey(SOUND_KEY)) {                      ②  

  33.         SimpleAudioEngine::getInstance()->playEffect("sound/Blip.wav");  

  34.     }  

  35. }  

  36.   

  37.   

  38. void HelloWorld::menuItemStartCallback(Ref* pSender)  

  39. {  

  40.     MenuItem* item = (MenuItem*)pSender;  

  41.     log("Touch Start %p", item);  

  42.     if (UserDefault::getInstance()->getBoolForKey(SOUND_KEY)) {                      ③  

  43.         SimpleAudioEngine::getInstance()->playEffect("sound/Blip.wav");  

  44.     }  

  45. }  

  46.   

  47.   

  48. void HelloWorld::onEnter()  

  49. {  

  50.     Layer::onEnter();  

  51.     log("HelloWorld onEnter");        

  52. }  

  53.   

  54.   

  55. void HelloWorld::onEnterTransitionDidFinish()  

  56. {  

  57.     Layer::onEnterTransitionDidFinish();  

  58.     log("HelloWorld onEnterTransitionDidFinish");  

  59.   

  60.   

  61.     //播放  

  62.     if (UserDefault::getInstance()->getBoolForKey(MUSIC_KEY)) {                      ④  

  63.         SimpleAudioEngine::getInstance()->playBackgroundMusic("sound/Jazz.mp3", true);  

  64.     }  

  65. }  

  66.   

  67.   

  68. void HelloWorld::onExit()  

  69. {  

  70.     Layer::onExit();  

  71.     log("HelloWorld onExit");  

  72. }  

  73.   

  74.   

  75. void HelloWorld::onExitTransitionDidStart()  

  76. {  

  77.     Layer::onExitTransitionDidStart();  

  78.     log("HelloWorld onExitTransitionDidStart");  

  79. }  

  80.   

  81.   

  82. void HelloWorld::cleanup()  

  83. {  

  84.     Layer::cleanup();  

  85.     log("HelloWorld cleanup");    

  86.     //中止  

  87.     SimpleAudioEngine::getInstance()->stopBackgroundMusic("sound/Jazz.mp3");  

  88. }  



上述第①、②、③行代碼中UserDefault::getInstance()->getBoolForKey(SOUND_KEY)是得到sound_key鍵值,經過取出布爾值判斷是否播放音效。第④行代碼UserDefault::getInstance()->getBoolForKey(MUSIC_KEY)是得到music_key鍵值,經過取出布爾值判斷是否播放背景音樂。
下面咱們再看看Setting場景SettingScene.cpp中的init()主要代碼以下:

[html] view plaincopy在CODE上查看代碼片派生到個人代碼片

  1. #include "SettingScene.h"  

  2.   

  3.   

  4. USING_NS_CC;  

  5. using namespace CocosDenshion;  

  6.   

  7.   

  8. bool Setting::init()  

  9. {  

  10.     ... ...  

  11.     UserDefault *defaults  = UserDefault::getInstance();  

  12.   

  13.   

  14.     if (defaults->getBoolForKey(MUSIC_KEY)) {                                    ①  

  15.         musicToggleMenuItem->setSelectedIndex(0);                                ②  

  16.     } else {  

  17.         musicToggleMenuItem->setSelectedIndex(1);                                ③  

  18.     }  

  19.   

  20.   

  21.     if (defaults->getBoolForKey(SOUND_KEY)) {                                    ④  

  22.         soundToggleMenuItem->setSelectedIndex(0);                                ⑤  

  23.     } else {  

  24.         soundToggleMenuItem->setSelectedIndex(1);                                ⑥  

  25.     }  

  26.   

  27.   

  28.     return true;  

  29. }  



上述代碼是設置開關菜單的狀態,第①~③行代碼是設置背景音樂開關菜單,其中第②行代碼是設置開關菜單爲Off,不然經過第③行代碼設置狀態爲On。第④~⑥行代碼是設置音效開關菜單,其中第⑤行代碼是設置開關菜單爲Off,不然經過第⑥行代碼設置狀態爲On。
SettingScene.cpp中的點擊音效開關菜單代碼以下: 

[html] view plaincopy在CODE上查看代碼片派生到個人代碼片

  1. void Setting::menuSoundToggleCallback(Ref* pSender)  

  2. {  

  3.     auto soundToggleMenuItem = (MenuItemToggle*)pSender;  

  4.     log("soundToggleMenuItem %d", soundToggleMenuItem->getSelectedIndex());  

  5.   

  6.   

  7.     UserDefault *defaults  = UserDefault::getInstance();  

  8.     if (defaults->getBoolForKey(SOUND_KEY)) {                                    ①  

  9.         defaults->setBoolForKey(SOUND_KEY, false);                               ②  

  10.     } else {  

  11.         defaults->setBoolForKey(SOUND_KEY, true);                                ③  

  12.         SimpleAudioEngine::getInstance()->playEffect("sound/Blip.wav");                  ④  

  13.     }  

  14.   

  15.   

  16. }  



上述代碼第①行判斷音效開狀態爲true狀況下,經過defaults->setBoolForKey(SOUND_KEY, false)語句設置false,不然經過第③行代碼defaults->setBoolForKey(SOUND_KEY, true)語句設置true,同時經過第④行代碼播放音效。
SettingScene.cpp中的點擊背景音樂開關菜單代碼以下: 

[html] view plaincopy在CODE上查看代碼片派生到個人代碼片

  1. void Setting::menuMusicToggleCallback(Ref* pSender)  

  2. {  

  3.     auto musicToggleMenuItem = (MenuItemToggle*)pSender;  

  4.     log("musicToggleMenuItem %d", musicToggleMenuItem->getSelectedIndex());  

  5.   

  6.   

  7.     UserDefault *defaults  = UserDefault::getInstance();  

  8.     if (defaults->getBoolForKey(MUSIC_KEY)) {                                    ①  

  9.         defaults->setBoolForKey(MUSIC_KEY, false);  

  10.         SimpleAudioEngine::getInstance()->stopBackgroundMusic();  

  11.     } else {  

  12.         defaults->setBoolForKey(MUSIC_KEY, true);  

  13.         SimpleAudioEngine::getInstance()->playBackgroundMusic("sound/Synth.mp3");  

  14.     }                                                                           ②  

  15. }  



上述代碼第①~②行是設置背景音樂開關菜單。代碼與點擊音效開關菜單相似,再也不解釋。還有SettingScene.cpp中的其它主要代碼以下: 

[html] view plaincopy在CODE上查看代碼片派生到個人代碼片

  1. void Setting::onEnter()  

  2. {  

  3.     Layer::onEnter();  

  4.     log("Setting onEnter");  

  5. }  

  6.   

  7.   

  8. void Setting::menuOkCallback(Ref* pSender)                                  ①  

  9. {  

  10.     Director::getInstance()->popScene();  

  11.   

  12.   

  13.     if (UserDefault::getInstance()->getBoolForKey(SOUND_KEY)) {                      ②  

  14.         SimpleAudioEngine::getInstance()->playEffect("sound/Blip.wav");  

  15.     }  

  16. }  

  17.   

  18.   

  19. void Setting::onEnterTransitionDidFinish()                                      ③  

  20. {  

  21.     Layer::onEnterTransitionDidFinish();  

  22.     log("Setting onEnterTransitionDidFinish");    

  23.   

  24.   

  25.     if (UserDefault::getInstance()->getBoolForKey(MUSIC_KEY)) {                      ④  

  26.         //播放  

  27.         SimpleAudioEngine::getInstance()->playBackgroundMusic("sound/Synth.mp3", true);  

  28.     }  

  29.   

  30.   

  31. }  

  32.   

  33.   

  34. void Setting::onExit()  

  35. {  

  36.     Layer::onExit();  

  37.     log("Setting onExit");    

  38. }  

  39.   

  40.   

  41. void Setting::onExitTransitionDidStart()  

  42. {  

  43.     Layer::onExitTransitionDidStart();  

  44.     log("Setting onExitTransitionDidStart");  

  45. }  

  46.   

  47.   

  48. void Setting::cleanup()  

  49. {  

  50.     Layer::cleanup();  

  51.     log("Setting cleanup");   

  52.     //中止  

  53.     SimpleAudioEngine::getInstance()->stopBackgroundMusic("sound/Synth.mp3");  

  54. }  



上述代碼第①行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課堂微信公共平臺

相關文章
相關標籤/搜索