尊重开发者的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/17163607
上节回顾
【cocos2d-x IOS游戏开发-捕鱼达人18】积分板实现
1、cocos2d-x中的声音支持
CocosDenshion
整个库完全依赖于OpenAL来实现。关于OpenAL,它不是Khronos Group的标准,而是Creative公司的一个开源库,可以软实现或硬件实现。目前硬件实现了OpenAL的好像就只有苹果的产品,因此在其他平台上,我们无法提供cocosDenshion底层的支持,但我们是支持顶层的,它是开发者最常用到的一层。
SimpleAudioEngine
Cocos2d-x已封装了SimpleAudioEngine用来跨平台。在我们的游戏中,我可以仅用一行代码,就能播放背景音乐和音效。
相关函数
playBackgroundMusic
stopBackgroundMusic
playEffect
stopAllEffects
2、游戏中的音效
相关的音效
大炮切换
炮弹发射
每种鱼死亡的音效
背景音乐
音效控制
开关
3、cocos2d-x中的声音格式调用
在大多数平台上,cocos2d-x调用不同的SDK API来播放背景音乐和音效。
CocosDenshion在同一时间只能播放一首背景音乐,但是能同时播放许多音效。
背景音乐
平台 |
支持的BGM格式 |
Android | 在android上CocosDenshion能支持的音频格式是对应于android.media.MediaPlayer所支持的格式。 |
iOS | 在IOS上面Cocos2d-x的CocosDenshion所支持的格式和Cocos2d-iphone中所支持的是一样,mp3,caf是推荐的格式。 |
windows | .mid, .wav, .mp3 are supported. |
Marmalade | mp3 |
音效
警告:Samsung i9100 似乎在音频驱动上面有一个bug。它不能同时播放太多音效。所以当你在Samsung i9100中运行你的程序的时候,最好不要调用SimpleAudioEngine::playEffect(const char*filePah)太过频繁。
平台 |
支持的音效格式 |
Android | ogg是最好的选择,对wav的支持不是太好 |
iOS | IOS 和cocos2d-iphone中cocosDenshion所支持的格式一样。个人建议是苹果的caf格式 |
windows | * .mid, .wav. |
Marmalade | 只支持原生 PCM格式(参照 http://www.madewithmarmalade.com/devnet/forum/5459) |
本游戏中音乐的具体的实现请看代码:
音乐控制:
void CGameLogic::onShoot(float x,float y,float dir ) { int cost = config::CBulletConfig::getData(m_iLevel)->Cost; if(m_iTotalMark < cost){ playEffect("NoBullet.wav",false); return; } const char *pEffect = NULL; switch(m_iLevel) { case 1: pEffect = "Silo1.wav"; break; case 2: pEffect = "Silo2.wav"; break; case 3: pEffect = "Silo3.wav"; break; case 4: pEffect = "Silo4.wav"; break; case 5: pEffect = "Silo5.wav"; break; default: return; } playEffect(pEffect,false); addMark(-cost); scene::ISceneObject* pS = m_pGameScene->createObject(1005); CBulletObject* pObj = new CBulletObject(pS,this,m_iLevel); pObj->setPosition(x,y); pObj->setDuration(dir); m_vecBulletsList.push_back(pObj); } void CGameLogic::openSound( bool b ) { m_SoundOpen = b; if(m_SoundOpen == true){ playMusic(config::CGameConfig::getBgMusic()); } else{ SimpleAudioEngine::sharedEngine()->stopBackgroundMusic(); SimpleAudioEngine::sharedEngine()->stopAllEffects(); } } void CGameLogic::playMusic( const char* file,bool bLoop /*= true*/ ) { if(m_SoundOpen==false) return; char buf[256]; sprintf(buf,"audio/%s",file); std::string pFullName = buf; pFullName = cocos2d::CCFileUtils::sharedFileUtils()->fullPathForFilename(pFullName.c_str()); SimpleAudioEngine::sharedEngine()->playBackgroundMusic(pFullName.c_str(),bLoop); //SimpleAudioEngine::sharedEngine()->playBackgroundMusic(pFullName,bLoop); } int CGameLogic::playEffect( const char* file,bool bLoop /*= false*/ ) { if(m_SoundOpen==false) return -1; char buf[256]; sprintf(buf,"audio/%s",file); std::string pFullName = buf; pFullName = cocos2d::CCFileUtils::sharedFileUtils()->fullPathForFilename(pFullName.c_str()); return SimpleAudioEngine::sharedEngine()->playEffect(pFullName.c_str(),bLoop); } void CGameLogic::stopEffect( int h /*= -1*/ ) { if(h==-1){ SimpleAudioEngine::sharedEngine()->stopAllEffects(); } else{ SimpleAudioEngine::sharedEngine()->stopEffect(h); } } }
本节源代码与工程文件:【资源引用页】
大家可以继续实现音乐的开关界面效果。