【Cocos2d-X开发学习笔记】第28期:游戏中音乐和音效的使用
本系列学习教程使用的是cocos2d-x-2.1.4(最新版为3.0alpha0-pre) ,PC开发环境Windows7,C++开发环境VS2010
UI在游戏中占有很重要的地位,但吸引玩家的除了这些看得到的界面和动画之外,游戏在后台中播放的背景音乐
及游戏中打击、动作等音效的配合则会让游戏更受玩家的喜爱。在Cocos2D-X中也为我们封装了一个跨平台的、播放
音频相关的类SimpleAudioEngine,下面就让我们一起来学习这个类。
一、音乐与音效
由于Cocos2D-X是跨平台的引擎,所以如果大家想通过一套代码多平台通用播放音乐与音效,可以通过Cocos2D-X
定义的宏CC_TARGET_PLATFORM平台变量来区别播放的音频格式。比如,Android只支持ogg的音频格式。
SimpleAudioEngine的使用比较简单,此类不需要创建,只需要调用其中的播放、暂停、重复播放等与音乐、音效
相关的函数即可。
二、音乐与音效的相关函数
1、音乐相关的函数
<1> preloadBackgroundMusic:(NSString *) filePath
作用:预加载背景音乐文件。
参数:音乐文件的相对路经。
<2> playBackgroundMusic:(NSString *) filePath loop:(BOOL) loop
作用:播放背景音乐文件。
参数1:音乐文件的相对路经。
参数2:是否重复播放。
<3> stopBackgroundMusic()
作用:停止背景音乐。
<4> pauseBackgroundMusic()
作用:暂停背景音乐。
<5> resumeBackgroundMusic()
作用:继续播放背景音乐。
<6> rewindBackgroundMusic()
作用:倒带到音乐刚开始。
<7> isBackgroundMusicPlaying()
作用:获取当前背景音乐是否正在播放中。
<8> float getBackgroundMusicVolume()
作用:获取当前背景音乐的音量。
返回值:其音量范围[0.0,1.0]。
<9> setBackgroundMusicVolume(float volume)
作用:设置当前背景音乐的音量。
返回值:其音量范围[0.0,1.0]。
2、音效相关的函数
<1> preloadEffect(const char * pszFilePath)
作用:预设加载音效。
参数:音效文件的相对路经。
<2> unloadEffect(const char * pszFilePath)
作用:释放音效文件。
参数:音效文件的相对路经。
<3> unsigned int preloadEffect(const char * pszFilePath,bool bLoop)
作用:播放音效文件。
参数1:音效文件的相对路经。
参数2:是否重复播放。
返回值:为播放的音效生成ID。
<4> stopEffect(unsigned int nSoundId)
作用:停止音效播放。
参数:需要停止音效的ID。
<5> pauseEffect(unsigned int nSoundId)
作用:暂停音效播放。
参数:需要暂停音效的ID。
<6> resumeEffect(unsigned int nSoundId)
作用:继续音效播放。
参数:需要继续播放音效的ID。
<7> float getEffectsVolume(unsigned int nSoundId)
作用:获取音效音量。
参数:音效音量范围[0.0,1.0]。
<8> setEffectsVolume(float volume)
作用:设置音效音量。
参数:音效音量范围[0.0,1.0]。
<9> pauseAllEffects()
作用:暂停所有音效。
<10> resumeAllEffects()
作用:继续播放所有音效。
<11> stopAllEffects()
作用:停止所有音效。
三、项目实例
1、首先新建Cocos2D-X项目,取名为“MyMusicEffect”,然后在HelloWorldScene.h文件中声明如下成员函数和变量。
- class HelloWorld : public cocos2d::CCLayer
- {
- public:
- // Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone
- virtual bool init();
- // there's no 'id' in cpp, so we recommand to return the exactly class pointer
- static cocos2d::CCScene* scene();
- //menuitem回调函数
- void menuBack(CCObject * pSender);
- //用以记录音效ID
- int effectId ;
- // implement the "static node()" method manually
- CREATE_FUNC(HelloWorld);
- };
2、然后在HelloWorldScene.cpp文件中添加如下所示代码。
- #include "HelloWorldScene.h"
- #include "SimpleAudioEngine.h"
- using namespace cocos2d;
- using namespace CocosDenshion;
- //根据不同平台使用预编译索引不同音频文件
- #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
- #define EFFECT_FILE "effect2.ogg"
- #elif( CC_TARGET_PLATFORM == CC_PLATFORM_MARMALADE)
- #define EFFECT_FILE "effect1.raw"
- #else
- #define EFFECT_FILE "effect1.wav"
- #endif
- #if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)
- #define MUSIC_FILE "music.mid"
- #elif (CC_TARGET_PLATFORM == CC_PLATFORM_BLACKBERRY)
- #define MUSIC_FILE "background.ogg"
- #else
- #define MUSIC_FILE "background.mp3"
- #endif
- std::string items[] = {
- "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",
- "unload effect",
- "add background music volume",
- "sub background music volume",
- "add effects volume",
- "sub effects volume",
- "pause effect",
- "resume effect",
- "pause all effects",
- "resume all effects",
- "stop all effects"
- };
- CCScene* HelloWorld::scene()
- {
- CCScene * scene = NULL;
- do
- {
- // 'scene' is an autorelease object
- scene = CCScene::create();
- CC_BREAK_IF(! scene);
- // 'layer' is an autorelease object
- HelloWorld *layer = HelloWorld::create();
- CC_BREAK_IF(! layer);
- // add layer as a child to scene
- scene->addChild(layer);
- } while (0);
- // return the scene
- return scene;
- }
- // on "init" you need to initialize your instance
- bool HelloWorld::init()
- {
- bool bRet = false;
- do
- {
- CC_BREAK_IF(! CCLayer::init());
- CCMenu* m_pItmeMenu = CCMenu::create();
- CCSize s = CCDirector::sharedDirector()->getWinSize();
- int m_nTestCount = sizeof(items) / sizeof(items[0]);
- for (int i = 0; i < m_nTestCount; i++){
- CCLabelTTF* label = CCLabelTTF::create(items[i].c_str(), "Arial", 15);
- CCMenuItemLabel* pMenuItem = CCMenuItemLabel::create(label, this, menu_selector(HelloWorld::menuBack));
- m_pItmeMenu->addChild(pMenuItem, i);
- pMenuItem->setPosition( CCPointMake(0, (s.height*0.5-20- (i + 1) * 15) ));
- }
- addChild(m_pItmeMenu,0,100);
- //预加载音乐和音效
- SimpleAudioEngine::sharedEngine()->preloadBackgroundMusic(MUSIC_FILE);
- SimpleAudioEngine::sharedEngine()->preloadEffect(EFFECT_FILE);
- //设置默认音量
- SimpleAudioEngine::sharedEngine()->setEffectsVolume(0.5);
- SimpleAudioEngine::sharedEngine()->setBackgroundMusicVolume(0.5);
- bRet = true;
- } while (0);
- return bRet;
- }
- void HelloWorld::menuBack(CCObject * pSender){
- CCMenuItem* pMenuItem = (CCMenuItem *)(pSender);
- int nIdx = pMenuItem->getZOrder() ;
- switch(nIdx)
- {
- 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("背景音乐正在播放");
- }else{
- CCLOG("背景音乐没在播放");
- }
- break;
- case 6:
- //播放音效,并且得到此音效的ID
- effectId = SimpleAudioEngine::sharedEngine()->playEffect(EFFECT_FILE);
- break;
- case 7:
- //重复播放音效
- effectId = SimpleAudioEngine::sharedEngine()->playEffect(EFFECT_FILE, true);
- break;
- case 8:
- //停止音效播放
- SimpleAudioEngine::sharedEngine()->stopEffect(effectId);
- break;
- case 9:
- //释放音效
- SimpleAudioEngine::sharedEngine()->unloadEffect(EFFECT_FILE);
- break;
- case 10:
- //增加背景音乐的音量
- SimpleAudioEngine::sharedEngine()->setBackgroundMusicVolume(SimpleAudioEngine::sharedEngine()->getBackgroundMusicVolume() + 0.1f);
- break;
- case 11:
- //减少背景音乐的音量
- SimpleAudioEngine::sharedEngine()->setBackgroundMusicVolume(SimpleAudioEngine::sharedEngine()->getBackgroundMusicVolume() - 0.1f);
- break;
- case 12:
- //增加音效的音量
- SimpleAudioEngine::sharedEngine()->setEffectsVolume(SimpleAudioEngine::sharedEngine()->getEffectsVolume() + 0.1f);
- break;
- case 13:
- //减少音效的音量
- SimpleAudioEngine::sharedEngine()->setEffectsVolume(SimpleAudioEngine::sharedEngine()->getEffectsVolume() - 0.1f);
- break;
- case 14:
- //暂停音效
- SimpleAudioEngine::sharedEngine()->pauseEffect(effectId);
- break;
- case 15:
- //继续播放音效
- SimpleAudioEngine::sharedEngine()->resumeEffect(effectId);
- break;
- case 16:
- //暂停所有音效
- SimpleAudioEngine::sharedEngine()->pauseAllEffects();
- break;
- case 17:
- //继续所有音效
- SimpleAudioEngine::sharedEngine()->resumeAllEffects();
- break;
- case 18:
- //停止所有音效
- SimpleAudioEngine::sharedEngine()->stopAllEffects();
- break;
- }
- }
3、实例效果图
【Cocos2d-X开发学习笔记】第28期:游戏中音乐和音效的使用的更多相关文章
- Rest API 开发 学习笔记(转)
Rest API 开发 学习笔记 概述 REST 从资源的角度来观察整个网络,分布在各处的资源由URI确定,而客户端的应用通过URI来获取资源的表示方式.获得这些表徵致使这些应用程序转变了其状态.随着 ...
- 【前端】移动端Web开发学习笔记【2】 & flex布局
上一篇:移动端Web开发学习笔记[1] meta标签 width设置的是layout viewport 的宽度 initial-scale=1.0 自带 width=device-width 最佳实践 ...
- 【前端】移动端Web开发学习笔记【1】
下一篇:移动端Web开发学习笔记[2] Part 1: 两篇重要的博客 有两篇翻译过来的博客值得一看: 两个viewport的故事(第一部分) 两个viewport的故事(第二部分) 这两篇博客探讨了 ...
- 驱动开发学习笔记. 0.07 Uboot链接地址 加载地址 和 链接脚本地址
驱动开发学习笔记. 0.07 Uboot链接地址 加载地址 和 链接脚本地址 最近重新看了乾龙_Heron的<ARM 上电启动及 Uboot 代码分析>(下简称<代码分析>) ...
- android开发学习笔记000
使用书籍:<疯狂android讲义>——李刚著,2011年7月出版 虽然现在已2014,可我挑来跳去,还是以这本书开始我的android之旅吧. “疯狂源自梦想,技术成就辉煌.” 让我这个 ...
- 高性能Cordova App开发学习笔记
高性能Cordova App开发学习笔记 文件结构 添加插件 构建准备 各个www的作用,prepare命令会将hello\www的内容会拷贝到platform下的wwww目录,知道该改哪里了吧?如果 ...
- 步步为营 SharePoint 开发学习笔记系列总结
转:http://www.cnblogs.com/springyangwc/archive/2011/08/03/2126763.html 概要 为时20多天的sharepoint开发学习笔记系列终于 ...
- Kinect开发学习笔记之(一)Kinect介绍和应用
Kinect开发学习笔记之(一)Kinect介绍和应用 zouxy09@qq.com http://blog.csdn.net/zouxy09 一.Kinect简单介绍 Kinectfor Xbox ...
- ASP.NET Core Web开发学习笔记-1介绍篇
ASP.NET Core Web开发学习笔记-1介绍篇 给大家说声报歉,从2012年个人情感破裂的那一天,本人的51CTO,CnBlogs,Csdn,QQ,Weboo就再也没有更新过.踏实的生活(曾辞 ...
随机推荐
- window下如何搭建linux环境
1.使用虚拟机 使用VMware虚拟机,下载linux内核系统,加载运行. 2.cygwin 安装cygwin,设置环境变量. 第二种方法还是比较简便的.优先考虑.
- 循环次数( M - 暴力求解、打表)
循环次数 Description 我们知道,在编程中,我们时常需要考虑到时间复杂度,特别是对于循环的部分.例如, 如果代码中出现 for(i=1;i ...
- 外设:K9F2G08 nandflash 底层读写、控制驱动程序,可随机读写
/****************************************************************************** Copyright (C), 2001- ...
- [Swust OJ 763]--校门外的树 Plus(暴力枚举)
题目链接:http://acm.swust.edu.cn/problem/0763/ Time limit(ms): 1000 Memory limit(kb): 65535 西南某科技大学的校门外有 ...
- BZOJ 2718: [Violet 4]毕业旅行( 最长反链 )
一不小心速度就成了#1.... 这道题显然是求最长反链, 最长反链=最小链覆盖.最小链覆盖就是先做一次floyd传递闭包, 再求最小路径覆盖. 最小路径覆盖=N - 二分图最大匹配. 所以把所有点拆成 ...
- java:转换时间格式为String
SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss"); Date curDate = new ...
- Android:设置背景图和标题
在MainActivity.onCreate(Bundle savedInstanceState){}设置背景图和标题. setTitle("wyl的diary");//标题,即左 ...
- 引用 mkimage使用详解
引用 鱼 的 mkimage使用详解 uboot源代码的tools/目录下有mkimage工具,这个工具可以用来制作不压缩或者压缩的多种可启动映象文件. mkimage在制作映象文件的时候,是在原来 ...
- PHP用CURL或fsockopen伪造IP和来路(referer)
URL是一个利用URL语法规定来传输文件和数据的工具,支持很多协议,如HTTP.FTP.TELNET等.最爽的是,PHP也支持 CURL库. 我们可以用CURL来伪造IP和来路,例子:1.php 请求 ...
- 17.1.1.4 Obtaining the Replication Master Binary Log Coordinates 获取复制Master Binary Log的坐标:
17.1.1.4 Obtaining the Replication Master Binary Log Coordinates 获取复制Master Binary Log的坐标: 你需要master ...