Cocos2d-x中背景音樂和音效使用實例
更新時間:2014年09月12日 09:38:03 作者:皂莢花
這篇文章主要介紹了Cocos2d-x中背景音樂和音效使用實例,注意本文中使用大量注釋來說明背景音樂和音效的使用方法,需要的朋友可以參考下
游戲中的音樂和音效是必不可少的,好的音樂可以給我們留下很深的印象也決定了這個游戲的品質。今天我們來學習一下cocos2d-x中如何使用音樂和音效。這些用到的函數(shù)都比較簡單,現(xiàn)在直接上代碼。
//聲音預先處理類的頭文件
#ifndef _AUDIO_PRETREAT_H
#define _AUDIO_PRETREAT_H
#include "cocos2d.h"
//使用聲音引擎必須包含SimpleAudioEngeim.h頭文件
#include "SimpleAudioEngine.h"
using namespace cocos2d;
//聲音引擎的命名空間
using namespace CocosDenshion;
//類AudioPretrea采用單例設計模式
//把用到的音樂做為枚舉類型
enum MUSIC_TYPE
{
MUSIC_TYPE_BACKGROUND //背景音樂
};
//把用到的音樂做為枚舉類型
enum EFFECT_TYPE
{
EFFECT_TYPE_EFFECT1
};
class AudioPretreat
{
private:
static AudioPretreat * m_audioPretreat;
public:
//單例設計的時候需要用到的倆個函數(shù)
static AudioPretreat * sharedAudioPretreat();
static void freeAudioPretreat();
//可以根據(jù)不同的平臺獲取不同的聲音文件
char * getMusic(MUSIC_TYPE type);
char * getEffect(EFFECT_TYPE type);
//在init中完成聲音的預先加載
bool init();
};
#endif
//聲音預先處理類的實現(xiàn)
#include "AudioPretreat.h"
//單例設計模式采用的慣用方式
AudioPretreat * AudioPretreat::m_audioPretreat = NULL;
AudioPretreat * AudioPretreat::sharedAudioPretreat()
{
if(NULL == m_audioPretreat)
{
m_audioPretreat = new AudioPretreat();
}
return m_audioPretreat;
}
//在AppDelegate析構的時候調用這個函數(shù)
void AudioPretreat::freeAudioPretreat()
{
if(m_audioPretreat)
{
delete m_audioPretreat;
m_audioPretreat = NULL;
}
}
//根據(jù)不同的平臺獲得不同的聲音文件
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ù)不同的平臺獲得不同的音效文件
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
{
//預先加載聲音,參數(shù)是聲音文件
SimpleAudioEngine::sharedEngine()->preloadBackgroundMusic(this->getMusic(MUSIC_TYPE_BACKGROUND));
//加載音效
SimpleAudioEngine::sharedEngine()->preloadEffect(this->getEffect(EFFECT_TYPE_EFFECT1));
//設置聲音的大小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();
//以下是對背景音樂的一些操作
//設置字符串,并且轉碼
std::string str1 = "播放背景音樂";
std::string str2 = "停止背景音樂";
std::string str3 = "暫停背景音樂";
std::string str4 = "恢復背景音樂";
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);
//以下是對音效的操作
std::string str11 = "播放音效";
std::string str12 = "停止音效";
std::string str13 = "暫停音效";
std::string str14 = "恢復音效";
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:
//播放聲音,第二個參數(shù)代表是否循環(huán)播放
SimpleAudioEngine::sharedEngine()->playBackgroundMusic(
AudioPretreat::sharedAudioPretreat()->getMusic(MUSIC_TYPE_BACKGROUND),true);
break;
case 2:
SimpleAudioEngine::sharedEngine()->stopBackgroundMusic();
break;
case 3:
//pause和resume成對使用
SimpleAudioEngine::sharedEngine()->pauseBackgroundMusic();
break;
case 4:
SimpleAudioEngine::sharedEngine()->resumeBackgroundMusic();
break;
case 5:
SimpleAudioEngine::sharedEngine()->rewindBackgroundMusic();
break;
case 6:
//這個函數(shù)在win32上沒法改變聲音的大小,大家用f12跟進函數(shù)的時候里邊是空,但是在android平臺上有實現(xiàn)
SimpleAudioEngine::sharedEngine()->setBackgroundMusicVolume(
SimpleAudioEngine::sharedEngine()->getBackgroundMusicVolume()+0.1f);
break;
case 7:
//這個函數(shù)在win32上沒法改變聲音的大小,大家用f12跟進函數(shù)的時候里邊是空,但是在android平臺上有實現(xiàn)
SimpleAudioEngine::sharedEngine()->setBackgroundMusicVolume(
SimpleAudioEngine::sharedEngine()->getBackgroundMusicVolume()-0.1f);
break;
case 11:
//第二個參數(shù)設為true的話則循環(huán)播放,soundID是在HelloWorld的頭文件中定義的
//音效函數(shù)不同于背景音樂的是會返回一個ID
soundID = SimpleAudioEngine::sharedEngine()->playEffect(
AudioPretreat::sharedAudioPretreat()->getEffect(EFFECT_TYPE_EFFECT1),true);
break;
case 12:
//音效函數(shù)大多會傳入一個ID,因為游戲中的音效不止一個
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;
}
}
//編碼格式轉化函數(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;
}

相關文章
C語言創(chuàng)建線程thread_create()的方法
這篇文章主要介紹了C語言創(chuàng)建線程thread_create()的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-02-02
C++如何將二叉搜索樹轉換成雙向循環(huán)鏈表(雙指針或數(shù)組)
這篇文章主要介紹了C++如何將二叉搜索樹轉換成雙向循環(huán)鏈表(雙指針或數(shù)組),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-05-05

