【3.x】

    (1)获取单例:sharedEngine() 改为 getInstance()

    (2)实现了:音量的调节。

    (3)修改了播放音效 playEffect() 的参数:

//// 现在还不能完全支持所有参数,限制的功能如下:// 在Samsung Galaxy S2上如果启用了OpenSL那么pitch参数无效;// 在emscrippten, win32, marmalade上pitch/pan/gain参数无效virtual unsigned int playEffect (const char* pszFilePath, // 音效文件的路径bool  bLoop = false,     // 是否循环播放,默认为false,不循环float pitch = 1.0f,      // 频率,正常情况下为1.0,在播放时也可以改变该值float pan = 0.0f,        // 声道,范围为-1到1,为-1时表示只有左声道,为1时表示只有右声道float gain = 1.0f        // 音量增益, 范围为0到1,默认值为1)
//

【SimpleAudioEngine】

音乐音效是每个游戏中不可或缺的部分,一个好的声音会给玩家留下深刻的印象,当一听到游戏的声音,就会不自觉得说出游戏的名称来。就像《中国好声音》一样,笔者对那首《斑马,斑马》印象就非常深刻,当然唱这首歌的那个妹子也不错。

好了,不扯了,继续学习……

1、音乐音效介绍

声音分为两类:背景音乐、音效。

(1)背景音乐:一般是贯穿整个游戏的音乐,时间长、重复次数少。

(2)音效:    一般是很短的那种声音特效,如砍杀、爆炸、走路等,短暂但使用比较频繁。

cocos2dx是一个跨平台的游戏引擎,它支持多种声音格式(比如MP3、WAV等)。可是呢,对于不同的平台,声音的格式可不一定是统一的。这就需要大家根据不同的平台,选择合适的声音格式了。

根据两种声音的特点,其采用的声音格式也有所不同。以下列出各平台所推荐的声音格式(当然并不是全部支持的格式,如IOS中背景音乐除了MP3和CAF外,还可以使用AAC、AMR等等)。

  背景音乐 音效
Win32 MP3、MID、WAV MID、WAV
Android MP3、MID、WAV OGG
IOS MP3、CAF CAF

由此可见,背景音乐最适合的选择是MP3格式。虽然音效也可以使用MP3格式,但是MP3是一种有损的压缩格式,而音效多数是短暂而快速的声响,有损的压缩方式可能导致有些采样音源消失,故音效不推荐使用MP3格式。而每个平台的音效格式均不相同,故需要根据不同平台,选用合适的格式。

2、SimpleAudioEngine

cocos2dx为我们提供了声音模块CocosDenshion。而其中有个SimpleAudioEngine类,是我们学习研究的对象。

使用SimpleAudioEngine时需要引入头文件和命名空间:

//#include "SimpleAudioEngine.h"using namespace CocosDenshion;
//

SimpleAudioEngine和CCDirector一样,也是一个单例类。说的通俗一点,它就是一个全局静态类。第一次调用时会创建一个全局静态对象,整个游戏的运行过程中会一直存在,全局都可以访问。

3、获取单例对象

SimpleAudioEngine的单例对象获取方法:

////通过SimpleAudioEngine::sharedEngine()获得static SimpleAudioEngine* sharedEngine();
//

4、背景音乐的函数

相关操作:预加载、播放、停止、暂停、恢复、重播,以及设置音量等。

//void preloadBackgroundMusic('音乐路径const char*');                  //预加载void playBackgroundMusic('音乐路径const char*', bool bLoop = false); //播放,是否循环,默认不循环void stopBackgroundMusic(bool bReleaseData = false);                 //停止,是否释放音乐资源void pauseBackgroundMusic();                                         //暂停void resumeBackgroundMusic();                                        //恢复void rewindBackgroundMusic();                                        //重播//返回是否将要播放背景音乐bool willPlayBackgroundMusic();//返回是否正在播放背景音乐//注意:暂停也算正在播放,只有停止了才算未播放。bool isBackgroundMusicPlaying(); //设置音量,取值范围0~1.0//查看了内部源码,发现音量的设置没有实现,即音量永远是1.0float getBackgroundMusicVolume();void setBackgroundMusicVolume(float volume);
//

5、音效的函数

相关操作:预加载、播放、停止、暂停、恢复、卸载,以及设置音量等。

//void preloadEffect('音乐路径const char*');                          //预加载unsigned int playEffect('音乐路径const char*', bool bLoop = false); //播放,返回该音效的ID。是否循环void stopEffect(unsigned int nSoundId);                             //停止指定ID的音效void stopAllEffects();                                              //停止所有音效void pauseEffect(unsigned int nSoundId);                            //暂停指定ID的音效void pauseAllEffects();                                             //暂停所有音效void resumeEffect(unsigned int nSoundId);                           //恢复指定ID的音效void resumeAllEffects();                                            //恢复所有音效void unloadEffect(const char* pszFilePath);                         //卸载音效资源//设置音量,取值范围0~1.0//查看了内部源码,发现音量的设置没有实现,即音量永远是1.0float getEffectsVolume();void setEffectsVolume(float volume);
//

6、关于预加载

加载音乐和音效通常是一个耗时的过程,为了防止由即时加载产生的延迟导致实际播放与游戏不协调的现象发生,在播放音效和背景音乐之前,记得要预加载音乐文件preload。另外需要根据不同的平台,选择不同的预加载音乐格式。

具体操作如下:

其中MUSIC_FILE就是音乐文件相对Resources文件夹的相对路径下的文件名。

//
/***        根据平台选择音乐音效的格式*///音效文件//Android平台只支持OGG的音效格式#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)#define EFFECT_FILE        "music/effect2.ogg"#elif( CC_TARGET_PLATFORM == CC_PLATFORM_MARMALADE)#define EFFECT_FILE        "music/effect1.raw"#else#define EFFECT_FILE        "music/effect1.wav"#endif//音乐文件#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)#define MUSIC_FILE        "music/music.mid"#elif (CC_TARGET_PLATFORM == CC_PLATFORM_BLACKBERRY || CC_TARGET_PLATFORM == CC_PLATFORM_LINUX )#define MUSIC_FILE        "music/background.ogg"#elif (CC_TARGET_PLATFORM == CC_PLATFORM_WP8)#define MUSIC_FILE        "music/background.wav"#else#define MUSIC_FILE        "music/background.mp3"#endif/***      预加载音乐音效*///加载背景音乐SimpleAudioEngine::sharedEngine()->preloadBackgroundMusic(MUSIC_FILE);//加载音效SimpleAudioEngine::sharedEngine()->preloadBackgroundMusic(EFFECT_FILE);
//

7、关于音量调节

我在测试调节音量大小的时候,惊人的发现:cocos2dx中的音量设置没有实现,即使你设置了音量大小也没用,它永远都是1.0。所以要想调节音量大小,还是通过设置系统的音量吧……

PS:在V3.x中已经实现了音量的调节。

源码如下:

//float SimpleAudioEngine::getBackgroundMusicVolume(){return 1.0;}void SimpleAudioEngine::setBackgroundMusicVolume(float volume){}float SimpleAudioEngine::getEffectsVolume(){return 1.0;}void SimpleAudioEngine::setEffectsVolume(float volume){}
//

8、使用技巧

(1)通过SimpleAudioEngine::sharedEngine()获取单例对象,然后调用相关函数。

(2)当退出程序时,记得要通过如下函数来释放单例对象,释放所有声音资源。

//SimpleAudioEngine::sharedEngine()->end()
//

(3)加载音乐和音效通常是一个耗时的过程,为了防止由即时加载产生的延迟导致实际播放与游戏不协调的现象发生,在播放音效和背景音乐之前,记得要预加载音乐文件preload。


【代码实战】

代码来源于cocos2dx的官方项目TestCpp中。

1、资源文件

将音乐音效文件资源放在项目的“Resources\music”目录下。

资源来自官方项目TestCpp中。

2、引入头文件和命名空间

//#include "SimpleAudioEngine.h"using namespace CocosDenshion;
//

3、预加载音乐音效

//
/***        根据平台选择音乐音效的格式*///音效文件//Android平台只支持OGG的音效格式#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)#define EFFECT_FILE        "music/effect2.ogg"#elif( CC_TARGET_PLATFORM == CC_PLATFORM_MARMALADE)#define EFFECT_FILE        "music/effect1.raw"#else#define EFFECT_FILE        "music/effect1.wav"#endif//音乐文件#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)#define MUSIC_FILE        "music/music.mid"#elif (CC_TARGET_PLATFORM == CC_PLATFORM_BLACKBERRY || CC_TARGET_PLATFORM == CC_PLATFORM_LINUX )#define MUSIC_FILE        "music/background.ogg"#elif (CC_TARGET_PLATFORM == CC_PLATFORM_WP8)#define MUSIC_FILE        "music/background.wav"#else#define MUSIC_FILE        "music/background.mp3"#endif/***      预加载音乐音效*///加载背景音乐SimpleAudioEngine::sharedEngine()->preloadBackgroundMusic(MUSIC_FILE);//加载音效SimpleAudioEngine::sharedEngine()->preloadBackgroundMusic(EFFECT_FILE);
//

4、创建控制音乐音效的菜单按钮

用菜单按钮来控制音乐的播放、暂停、停止、恢复等。

////创建控制音乐音效的菜单按钮std::string testItems[] = {"play background music","stop background music","pause background music","resume background music","rewind background music","is background music playing","play effect","play effect repeatly","stop effect","pause effect","resume effect","pause all effects","resume all effects","stop all effects","unload effect","add background music volume","sub background music volume","add effects volume","sub effects volume"};//创建菜单CCMenu* pMenu = CCMenu::create();pMenu->setContentSize(CCSizeMake(480,1000));for (int i = 0; i < 19; ++i){CCLabelTTF* label = CCLabelTTF::create(testItems[i].c_str(), "Arial", 24);CCMenuItemLabel* pMenuItem = CCMenuItemLabel::create(label, this, menu_selector(HelloWorld::menuCallback));pMenuItem->setPosition( ccp(mysize.width/2, 1000 - (i+1)*50 ) );pMenu->addChild(pMenuItem, 0, i);}//将菜单作为容器,放入滚动视图中CCScrollView* scrollView = CCScrollView::create(CCSizeMake(480, 320), pMenu);scrollView->setDirection(kCCScrollViewDirectionVertical);scrollView->setPosition(CCPointZero);pMenu->setPosition( ccp(0, 320-1000) );this->addChild(scrollView);
//

5、编写菜单按钮回调函数

根据点击的菜单项Tag,来控制音乐音效。

//void HelloWorld::menuCallback(CCObject* sender){//获取菜单按钮编号int idx = ((CCMenuItem*)sender)->getTag();switch(idx){//音乐控制case 0: SimpleAudioEngine::sharedEngine()->playBackgroundMusic(MUSIC_FILE, true); break; //播放音乐,循环case 1: SimpleAudioEngine::sharedEngine()->stopBackgroundMusic();                 break; //停止音乐case 2: SimpleAudioEngine::sharedEngine()->pauseBackgroundMusic();                break; //暂停音乐case 3: SimpleAudioEngine::sharedEngine()->resumeBackgroundMusic();               break; //恢复音乐case 4: SimpleAudioEngine::sharedEngine()->rewindBackgroundMusic();               break; //重播音乐case 5:if (SimpleAudioEngine::sharedEngine()->isBackgroundMusicPlaying())                   //是否正在播放背景音乐{CCLOG("background music is playing");}else{CCLOG("background music is not playing");}break;//音效控制case 6: m_soundID = SimpleAudioEngine::sharedEngine()->playEffect(EFFECT_FILE);        break; //播放音效,不循环case 7: m_soundID = SimpleAudioEngine::sharedEngine()->playEffect(EFFECT_FILE, true);  break; //播放音效,循环case 8: SimpleAudioEngine::sharedEngine()->stopEffect(m_soundID);                      break; //停止指定ID的音效case 9: SimpleAudioEngine::sharedEngine()->pauseEffect(m_soundID);                     break; //暂停指定ID的音效case 10: SimpleAudioEngine::sharedEngine()->resumeEffect(m_soundID);                   break; //恢复指定ID的音效case 11: SimpleAudioEngine::sharedEngine()->pauseAllEffects();                         break; //暂停所有音效case 12: SimpleAudioEngine::sharedEngine()->resumeAllEffects();                        break; //恢复所有音效case 13: SimpleAudioEngine::sharedEngine()->stopAllEffects();                          break; //停止所有音效case 14: SimpleAudioEngine::sharedEngine()->unloadEffect(EFFECT_FILE);                 break; //卸载音效//音量控制case 15:SimpleAudioEngine::sharedEngine()->setBackgroundMusicVolume(SimpleAudioEngine::sharedEngine()->getBackgroundMusicVolume() + 0.1f);break;case 16:SimpleAudioEngine::sharedEngine()->setBackgroundMusicVolume(SimpleAudioEngine::sharedEngine()->getBackgroundMusicVolume() - 0.1f);break;case 17:SimpleAudioEngine::sharedEngine()->setEffectsVolume(SimpleAudioEngine::sharedEngine()->getEffectsVolume() + 0.1f);break;case 18:SimpleAudioEngine::sharedEngine()->setEffectsVolume(SimpleAudioEngine::sharedEngine()->getEffectsVolume() - 0.1f);break;}}
//

6、运行结果

声音不是视觉效果,所以自己实现代码后,玩耍去吧!

cocos2dx基础篇(17) 音乐音效SimpleAudioEngine相关推荐

  1. cocos2dx基础篇(19)——音乐音效SimpleAudioEngine

    [唠叨] 本节比较简单,主要讲讲cocos2dx引擎中的音乐音效SimpleAudioEngine. [致谢] http://gl.paea.cn/contents/f86d1f6e2a52e7ea. ...

  2. cocos2dx基础篇(15)——音乐音效SimpleAudioEngine

    [唠叨] 本节比较简单,主要讲讲cocos2dx引擎中的音乐音效SimpleAudioEngine. [致谢] http://gl.paea.cn/contents/f86d1f6e2a52e7ea. ...

  3. cocos2dx[2.x](14)--音乐音效SimpleAudioEngine

    [唠叨] 本节比较简单,主要讲讲cocos2dx引擎中的音乐音效SimpleAudioEngine. [致谢] http://gl.paea.cn/contents/f86d1f6e2a52e7ea. ...

  4. cocos2dx基础篇——音乐音效SimpleAudioEngine

    http://shahdza.blog.51cto.com/2410787/1545820/ [SimpleAudioEngine] 音乐音效是每个游戏中不可或缺的部分,一个好的声音会给玩家留下深刻的 ...

  5. cocos2dx基础篇(2)——Win32移植到Android

    [安装工具] JDK Eclipse 或直接下一个 ADT集成开发工具 SDK NDK9r ADT CDT    安装方法自行百度. [正文]    1.由 Cocos2D-X 和 VS2010 环境 ...

  6. cocos2dx基础篇(24)——基本动画CCAnimation/CCAnimate

    [唠叨] 基本动画制作需要用到CCAnimation类,用于存储动画相关的信息.以及由CCActionInterval继承的CCAnimate动画动作. 还有一些在创建动画动作的过程中,可能会用到的一 ...

  7. cocos2dx基础篇(23)——进度条CCProgressTimer

    本文出自 "夏天的风" 博客,请务必保留此出处http://shahdza.blog.51cto.com/2410787/1546707 [唠叨] 哎,周围的同学都在搞cocos2 ...

  8. cocos2d-x 提升篇 (17) 简单的桌上足球游戏

    这个例子改编来自Cocos2d-x by Example. 相当于一个简单的桌上足球游戏,可以通过触摸的方式碰撞红色的球,进入对方的球门就可以加一分. #ifndef _APP_DELEGATE_H_ ...

  9. cocos2dx基础篇(6)一-字体标签Label

    cocos2dx提供了三种文字字体的显示:CCLabelTTF(一般字体).CCLabelAtlas(自定义字体).CCLabelBMFont(自定义字体).接下来给大家讲讲这三种字体的使用方法. [ ...

最新文章

  1. 【GLib】GLib学习笔记(一):GLib、GObject、GType
  2. 数据库写入中文出现乱码的处理方式
  3. 阿里开发规范_字字珠玑,高级技术专家带你了解阿里的开发流程规范
  4. flask json传输失败_GO小知识之实例演示 json 如何转化为 map 和 struct
  5. 绕过深澜校园宽带认证客户端使用校园网的方法
  6. 数字化会议管理系统,实现会议全流程管理
  7. 2022年湖北安全员ABC证书查询是在哪里查真假呢?
  8. 开发人员如何在面试中介绍自己的项目经历
  9. SPSS结果解读——【独立样本T检验】【方差齐性】
  10. python判断三角形程序_python三角形判定怎么做
  11. CSS 让背景图片全部显示,填满父div
  12. MAC版 破解百度云、百度网盘限速的方法
  13. acs流程图_两张流程图,搞定ACS后血脂管理
  14. 做事的态度与工作态度 (2007-04-29 09:19)
  15. 7-51单片机ESP8266学习-AT指令(测试TCP服务器--51单片机程序配置8266,用手机TCP调试助手发信息给单片机控制小灯的亮灭)
  16. Java设计模式-模板方法模式详解
  17. Android修行之路——Android程序设计基础(三)
  18. 破解Visra系统登录密码
  19. Linux Qt cannot find -lGL 解决方案
  20. mapreuce1.0局限性

热门文章

  1. 视频号即将爆发,你准备好了吗?
  2. apt update时出现Duplicate sources.list entry http://mirrors.tuna.tsinghua.edu.cn/ubuntu xenial Release
  3. springmvc 重定向到外网地址
  4. 使用PostMan 访问天气接口
  5. Python爬虫根据公司名称爬取信息并保存为json格式的txt文件qcc
  6. 2021年陕西民营企业50强排行榜:仅成立2年的龙记泰信实业集团有限公司排名第3(附年榜TOP50详单)
  7. 总算把凯利公式说明白了
  8. linux的作业控制(job control)
  9. 央视网评:国耻不能忘却 但不应该落井下石
  10. macos10.8.5原版系统dmg转iso