【cocos2d-x入门实战】背景音乐和音效

原创作品,转载请标明http://blog.csdn.net/jackystudio/article/details/12117827

整个游戏完成了,可以痛快的在电脑上打飞机了!可是感觉少了点什么?

对了,背景音乐和游戏音效。还记得最初我们在创建cocos2dx工程的时候有一步要勾选的选项吗?SimpleAudioEngine!没错就是它。


1.音乐格式

官方文档中是这么写的:

[cpp]  view plain copy
  1. Android:在android上CocosDenshion能支持的音频格式是对应于android.media.MediaPlayer所支持的格式。  
  2. iOS:在IOS上面Cocos2d-x的CocosDenshion所支持的格式和Cocos2d-iphone中所支持的是一样,mp3,caf是推荐的格式。  
  3. windows:.mid, .wav are supported. Note that mp3 is not supported.  
  4. Marmalade:mp3  
说是windows不支持mp3,但是实际使用的时候,发现mp3也是可以正常在windows下播放的。

2.背景音乐

背景音乐在整个游戏中,同一时间只能有一个。

(1)加入头文件,使用命名空间

[cpp]  view plain copy
  1. #include "SimpleAudioEngine.h"  
  2. using namespace CocosDenshion;//很多人少了这一步导致找不到SimpleAudioEngine  
当然也可以在使用SimpleAudioEngine时这么写:

[cpp]  view plain copy
  1. CocosDenshion::SimpleAudioEngine  
(2)预加载背景音乐

我们在WelcomeScene中预加载背景音乐,其实这一步木有用,后面解释到。

[cpp]  view plain copy
  1. SimpleAudioEngine::sharedEngine()->preloadBackgroundMusic("sound/game_music.mp3");  
(3)背景音乐的其他API

[cpp]  view plain copy
  1. SimpleAudioEngine::sharedEngine()->playBackgroundMusic("sound/game_music.mp3",true);//开始播放背景音乐,true表示循环  
  2. SimpleAudioEngine::sharedEngine()->stopBackgroundMusic();//停止背景音乐,这是一个缺省参数函数,传参表示是否释放音乐文件  
  3. SimpleAudioEngine::sharedEngine()->pauseBackgroundMusic();//暂停背景音乐  
  4. SimpleAudioEngine::sharedEngine()->rewindBackgroundMusic();//重头调用背景音乐  
  5. SimpleAudioEngine::sharedEngine()->isBackgroundMusicPlaying()//返回布尔型参数,表示是否在放着背景音乐  
  6. SimpleAudioEngine::sharedEngine()->setBackgroundMusicVolume(0.5);//设置音量0.0-1.0  

至于在游戏过程中,要在暂停,结束之类的地方哪里控制我就不说了,看你们的喜好了。


3.游戏音效

游戏音效是可以重叠的。

(1)一样的头文件和命名空间

(2)预加载音效

[cpp]  view plain copy
  1. SimpleAudioEngine::sharedEngine()->preloadEffect("sound/bullet.mp3");  
(3)游戏音效的其他API
[cpp]  view plain copy
  1. SimpleAudioEngine::sharedEngine()->playEffect("sound/bullet.mp3",false);//开始播放背景音效,false表示不循环  
  2. SimpleAudioEngine::sharedEngine()->stopEffect(m_nSoundId);//停止音效,可以选择单独停掉一个音效,这个值是由playEffect返回的  
  3. SimpleAudioEngine::sharedEngine()->stopAllEffects();//停止全部音效  
  4. SimpleAudioEngine::sharedEngine()->pauseEffect(m_nSoundId);//暂停单个音效  
  5. SimpleAudioEngine::sharedEngine()->resumeEffect(m_nSoundId);//重新开始音效  
  6. SimpleAudioEngine::sharedEngine()->pauseAllEffects();//暂停全部音效  
  7. SimpleAudioEngine::sharedEngine()->resumeAllEffects();//重新开始全部音效  
  8. SimpleAudioEngine::sharedEngine()->setEffectsVolume(0.5);//设置音效音量0.0-1.0  
  9. SimpleAudioEngine::sharedEngine()->unloadEffect("sound/bullet.mp3");//卸载音效  

4.释放资源

查看SimpleAudioEngine的源码,我们可以发现,在preloadEffect()的时候,引擎会把音效加到

[cpp]  view plain copy
  1. static EffectList s_List;  

其中EffectList是一个map,包含了音效文件和由它获得的一个hash值。因此载入内存后可以提高音效的加载效率。

所以在使用结束后,要记得释放掉音效资源,调用:

[cpp]  view plain copy
  1. void SimpleAudioEngine::end()  
就可以把s_List所指向的音乐资源释放掉。

而我们再看看preloadBackgroundMusic()的实现:

[cpp]  view plain copy
  1. void SimpleAudioEngine::preloadBackgroundMusic(const char* pszFilePath)  
  2. {  
  3.   
  4. }  
尼玛,竟然是空实现。。。负分滚粗。。。

再看playBackgroundMusic()源码:

[cpp]  view plain copy
  1. void SimpleAudioEngine::playBackgroundMusic(const char* pszFilePath, bool bLoop)  
  2. {  
  3.     if (! pszFilePath)  
  4.     {  
  5.         return;  
  6.     }  
  7.   
  8.     sharedMusic().Open(_FullPath(pszFilePath), _Hash(pszFilePath));  
  9.     sharedMusic().Play((bLoop) ? -1 : 1);  
  10. }  
背景音乐这货竟然是play的时候才载入。。。好吧,你赢了。。。

其实有兴趣的同学可以模仿音效那样,把preloadBackgroundMusic实现了(先载入内存),然后再play的时候直接播放,这样效率会快多了。没理解源码的意思,难道是攻城狮忙着打灰机没空写么?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值