Cocos2d-x中背景音樂和音效使用實(shí)例
游戲中的音樂和音效是必不可少的,好的音樂可以給我們留下很深的印象也決定了這個(gè)游戲的品質(zhì)。今天我們來學(xué)習(xí)一下cocos2d-x中如何使用音樂和音效。這些用到的函數(shù)都比較簡(jiǎn)單,現(xiàn)在直接上代碼。
//聲音預(yù)先處理類的頭文件 #ifndef _AUDIO_PRETREAT_H #define _AUDIO_PRETREAT_H #include "cocos2d.h" //使用聲音引擎必須包含SimpleAudioEngeim.h頭文件 #include "SimpleAudioEngine.h" using namespace cocos2d; //聲音引擎的命名空間 using namespace CocosDenshion; //類AudioPretrea采用單例設(shè)計(jì)模式 //把用到的音樂做為枚舉類型 enum MUSIC_TYPE { MUSIC_TYPE_BACKGROUND //背景音樂 }; //把用到的音樂做為枚舉類型 enum EFFECT_TYPE { EFFECT_TYPE_EFFECT1 }; class AudioPretreat { private: static AudioPretreat * m_audioPretreat; public: //單例設(shè)計(jì)的時(shí)候需要用到的倆個(gè)函數(shù) static AudioPretreat * sharedAudioPretreat(); static void freeAudioPretreat(); //可以根據(jù)不同的平臺(tái)獲取不同的聲音文件 char * getMusic(MUSIC_TYPE type); char * getEffect(EFFECT_TYPE type); //在init中完成聲音的預(yù)先加載 bool init(); }; #endif
//聲音預(yù)先處理類的實(shí)現(xiàn) #include "AudioPretreat.h" //單例設(shè)計(jì)模式采用的慣用方式 AudioPretreat * AudioPretreat::m_audioPretreat = NULL; AudioPretreat * AudioPretreat::sharedAudioPretreat() { if(NULL == m_audioPretreat) { m_audioPretreat = new AudioPretreat(); } return m_audioPretreat; } //在AppDelegate析構(gòu)的時(shí)候調(diào)用這個(gè)函數(shù) void AudioPretreat::freeAudioPretreat() { if(m_audioPretreat) { delete m_audioPretreat; m_audioPretreat = NULL; } } //根據(jù)不同的平臺(tái)獲得不同的聲音文件 char * AudioPretreat::getMusic(MUSIC_TYPE type) { switch(type) { case MUSIC_TYPE_BACKGROUND: //WIN32,ANDROID,IOS都使用MP3格式的背景音樂 #if(CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) return "background-music.mp3"; #else(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) return "background-music.mp3"; #endif break; } return NULL; } //根據(jù)不同的平臺(tái)獲得不同的音效文件 char * AudioPretreat::getEffect(EFFECT_TYPE type) { switch(type) { case EFFECT_TYPE_EFFECT1: #if(CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) return "pew-pew-lei.wav"; #else(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) return "pew-pew-lei.ogg"; #endif } return NULL; } //init函數(shù)中完成一些初始化的操作 bool AudioPretreat::init() { bool bRet = false; do { //預(yù)先加載聲音,參數(shù)是聲音文件 SimpleAudioEngine::sharedEngine()->preloadBackgroundMusic(this->getMusic(MUSIC_TYPE_BACKGROUND)); //加載音效 SimpleAudioEngine::sharedEngine()->preloadEffect(this->getEffect(EFFECT_TYPE_EFFECT1)); //設(shè)置聲音的大小0.0-1.0 SimpleAudioEngine::sharedEngine()->setBackgroundMusicVolume(0.1f); bRet = true; } while(0); return bRet; }
// 下面就來看一下如何使用聲音引擎 bool HelloWorld::init() { bool bRet = false; do { CC_BREAK_IF(! CCLayer::init()); CCSize size = CCDirector::sharedDirector()->getVisibleSize(); AudioPretreat::sharedAudioPretreat()->init(); //以下是對(duì)背景音樂的一些操作 //設(shè)置字符串,并且轉(zhuǎn)碼 std::string str1 = "播放背景音樂"; std::string str2 = "停止背景音樂"; std::string str3 = "暫停背景音樂"; std::string str4 = "恢復(fù)背景音樂"; std::string str5 = "重頭播放背景音樂"; std::string str6 = "背景音樂:加"; std::string str7 = "背景音樂:減"; GBKToUTF8(str1,"GB2312","UTF-8"); GBKToUTF8(str2,"GB2312","UTF-8"); GBKToUTF8(str3,"GB2312","UTF-8"); GBKToUTF8(str4,"GB2312","UTF-8"); GBKToUTF8(str5,"GB2312","UTF-8"); GBKToUTF8(str6,"GB2312","UTF-8"); GBKToUTF8(str7,"GB2312","UTF-8"); CCMenuItemFont::setFontSize(24); CCMenuItemFont::setFontName("Arial"); CCMenuItemFont * menu1 = CCMenuItemFont::create(str1.c_str(),this,menu_selector(HelloWorld::menu)); menu1->setTag(1); CCMenuItemFont * menu2 = CCMenuItemFont::create(str2.c_str(),this,menu_selector(HelloWorld::menu)); menu2->setTag(2); CCMenuItemFont * menu3 = CCMenuItemFont::create(str3.c_str(),this,menu_selector(HelloWorld::menu)); menu3->setTag(3); CCMenuItemFont * menu4 = CCMenuItemFont::create(str4.c_str(),this,menu_selector(HelloWorld::menu)); menu4->setTag(4); CCMenuItemFont * menu5 = CCMenuItemFont::create(str5.c_str(),this,menu_selector(HelloWorld::menu)); menu5->setTag(5); CCMenuItemFont * menu6 = CCMenuItemFont::create(str6.c_str(),this,menu_selector(HelloWorld::menu)); menu6->setTag(6); CCMenuItemFont * menu7 = CCMenuItemFont::create(str7.c_str(),this,menu_selector(HelloWorld::menu)); menu7->setTag(7); CCMenu * leftMenu = CCMenu::create(menu1,menu2,menu3,menu4,menu5,menu6,menu7,NULL); leftMenu->alignItemsVerticallyWithPadding(5); leftMenu->setPositionX(size.width/4); this->addChild(leftMenu); //以下是對(duì)音效的操作 std::string str11 = "播放音效"; std::string str12 = "停止音效"; std::string str13 = "暫停音效"; std::string str14 = "恢復(fù)音效"; std::string str15 = "從緩存中移除音效"; std::string str16 = "音效:加"; std::string str17 = "音效:減"; GBKToUTF8(str11,"GB2312","UTF-8"); GBKToUTF8(str12,"GB2312","UTF-8"); GBKToUTF8(str13,"GB2312","UTF-8"); GBKToUTF8(str14,"GB2312","UTF-8"); GBKToUTF8(str15,"GB2312","UTF-8"); GBKToUTF8(str16,"GB2312","UTF-8"); GBKToUTF8(str17,"GB2312","UTF-8"); CCMenuItemFont * menu11 = CCMenuItemFont::create(str11.c_str(),this,menu_selector(HelloWorld::menu)); menu11->setTag(11); CCMenuItemFont * menu12 = CCMenuItemFont::create(str12.c_str(),this,menu_selector(HelloWorld::menu)); menu12->setTag(12); CCMenuItemFont * menu13 = CCMenuItemFont::create(str13.c_str(),this,menu_selector(HelloWorld::menu)); menu13->setTag(13); CCMenuItemFont * menu14 = CCMenuItemFont::create(str14.c_str(),this,menu_selector(HelloWorld::menu)); menu14->setTag(14); CCMenuItemFont * menu15 = CCMenuItemFont::create(str15.c_str(),this,menu_selector(HelloWorld::menu)); menu15->setTag(15); CCMenuItemFont * menu16 = CCMenuItemFont::create(str16.c_str(),this,menu_selector(HelloWorld::menu)); menu16->setTag(16); CCMenuItemFont * menu17 = CCMenuItemFont::create(str17.c_str(),this,menu_selector(HelloWorld::menu)); menu17->setTag(17); CCMenu * rightMenu = CCMenu::create(menu11,menu12,menu13,menu14,menu15,menu16,menu17,NULL); rightMenu->alignItemsVerticallyWithPadding(5); rightMenu->setPositionX(size.width*3/4); this->addChild(rightMenu); bRet = true; } while (0); return bRet; } void HelloWorld::menu(CCObject * sender) { CCNode * node = (CCNode *)sender; int tag = node->getTag(); switch(tag) { case 1: //播放聲音,第二個(gè)參數(shù)代表是否循環(huán)播放 SimpleAudioEngine::sharedEngine()->playBackgroundMusic( AudioPretreat::sharedAudioPretreat()->getMusic(MUSIC_TYPE_BACKGROUND),true); break; case 2: SimpleAudioEngine::sharedEngine()->stopBackgroundMusic(); break; case 3: //pause和resume成對(duì)使用 SimpleAudioEngine::sharedEngine()->pauseBackgroundMusic(); break; case 4: SimpleAudioEngine::sharedEngine()->resumeBackgroundMusic(); break; case 5: SimpleAudioEngine::sharedEngine()->rewindBackgroundMusic(); break; case 6: //這個(gè)函數(shù)在win32上沒法改變聲音的大小,大家用f12跟進(jìn)函數(shù)的時(shí)候里邊是空,但是在android平臺(tái)上有實(shí)現(xiàn) SimpleAudioEngine::sharedEngine()->setBackgroundMusicVolume( SimpleAudioEngine::sharedEngine()->getBackgroundMusicVolume()+0.1f); break; case 7: //這個(gè)函數(shù)在win32上沒法改變聲音的大小,大家用f12跟進(jìn)函數(shù)的時(shí)候里邊是空,但是在android平臺(tái)上有實(shí)現(xiàn) SimpleAudioEngine::sharedEngine()->setBackgroundMusicVolume( SimpleAudioEngine::sharedEngine()->getBackgroundMusicVolume()-0.1f); break; case 11: //第二個(gè)參數(shù)設(shè)為true的話則循環(huán)播放,soundID是在HelloWorld的頭文件中定義的 //音效函數(shù)不同于背景音樂的是會(huì)返回一個(gè)ID soundID = SimpleAudioEngine::sharedEngine()->playEffect( AudioPretreat::sharedAudioPretreat()->getEffect(EFFECT_TYPE_EFFECT1),true); break; case 12: //音效函數(shù)大多會(huì)傳入一個(gè)ID,因?yàn)橛螒蛑械囊粜Р恢挂粋€(gè) SimpleAudioEngine::sharedEngine()->stopEffect(soundID); break; case 13: SimpleAudioEngine::sharedEngine()->pauseEffect(soundID); break; case 14: SimpleAudioEngine::sharedEngine()->resumeEffect(soundID); case 15: //從緩存中移除音效,需要傳入移除的音效的名字 SimpleAudioEngine::sharedEngine()->unloadEffect( AudioPretreat::sharedAudioPretreat()->getEffect(EFFECT_TYPE_EFFECT1)); case 16: SimpleAudioEngine::sharedEngine()->setEffectsVolume( SimpleAudioEngine::sharedEngine()->getEffectsVolume()+0.1); break; case 17: SimpleAudioEngine::sharedEngine()->setEffectsVolume( SimpleAudioEngine::sharedEngine()->getEffectsVolume()-0.1); break; } } //編碼格式轉(zhuǎn)化函數(shù) int GBKToUTF8(std::string & gbkStr, const char* toCode, const char* fromCode) { iconv_t iconvH; iconvH = iconv_open(fromCode, toCode); if (iconvH == 0) { return -1; } const char* strChar = gbkStr.c_str(); const char** pin = &strChar; size_t strLength = gbkStr.length(); char* outbuf = (char*) malloc(strLength*4); char* pBuff = outbuf; memset( outbuf, 0, strLength*4); size_t outLength = strLength*4; if (-1 == iconv(iconvH, pin, &strLength, &outbuf, &outLength)) { iconv_close(iconvH); return -1; } gbkStr = pBuff; iconv_close(iconvH); return 0; }
- Cocos2d-x保存用戶游戲數(shù)據(jù)CCUserDefault類使用實(shí)例
- Cocos2d-x中獲取系統(tǒng)時(shí)間和隨機(jī)數(shù)實(shí)例
- Cocos2d-x觸摸事件實(shí)例
- Cocos2d-x人物動(dòng)作類實(shí)例
- php中Swoole的熱更新實(shí)現(xiàn)代碼實(shí)例
- React Native 實(shí)現(xiàn)熱更新并自動(dòng)簽名打包功能
- nodemon實(shí)現(xiàn)Typescript項(xiàng)目熱更新的示例代碼
- 解決vuecli3.0熱更新失效的問題
- 詳解webpack 熱更新優(yōu)化
- 全面講解CocosCreator熱更新
相關(guān)文章
C語(yǔ)言創(chuàng)建線程thread_create()的方法
這篇文章主要介紹了C語(yǔ)言創(chuàng)建線程thread_create()的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02C++如何將二叉搜索樹轉(zhuǎn)換成雙向循環(huán)鏈表(雙指針或數(shù)組)
這篇文章主要介紹了C++如何將二叉搜索樹轉(zhuǎn)換成雙向循環(huán)鏈表(雙指針或數(shù)組),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05C語(yǔ)言實(shí)現(xiàn)搶紅包程序代碼精簡(jiǎn)版
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)搶紅包程序代碼的精簡(jiǎn)版,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07從零學(xué)習(xí)cmake構(gòu)建系統(tǒng)
這篇文章主要為大家介紹了從零學(xué)習(xí)cmake構(gòu)建系統(tǒng)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02C++中vector容器的注意事項(xiàng)總結(jié)
在c++中,vector是一個(gè)十分有用的容器,下面這篇文章主要給大家介紹了關(guān)于C++中vector容器的注意事項(xiàng),文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2021-12-12