【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就再也没有更新过.踏实的生活(曾辞 ...
随机推荐
- STL之如何选择顺序容器
一.顺序容器的分类 顺序容器:vector向量.list链表.deque双端队列: 优先级最高的是vector向量,它的速度比较快,优点最多: 在程序设计中,容器可以切换: #include < ...
- java打印日历
打个日历,写了半天,感情水平真菜, 不过主要是不会数组,明天一定要把数组看了 package demo; import java.util.Scanner; public class Demo { / ...
- linux内核代码container_of
它的作用显而易见,那就是根据一个结构体变量中的一个域成员变量的指针来获取指向整个结构体变量的指针. typedef unsigned int __kernel_size_t; typedef __ke ...
- 转百度前辈的Trados使用心得
我用Trados的时间不长,可以说是一个新手.但我在较短的时间内就已经初步掌握这个工具,说明它并不是那么神秘,并不是那么深不可测.这里,我说一说学习它的一点体会.在我转发的文章中有的内容,我就少讲一些 ...
- Week11(11月19日):补课
Part I:提问 =========================== 1.如何增加一条记录到数据库? Part II:案例学习 =========================== Music ...
- Directshow 通过 put_Owner 指定显示窗口后,自动刷新问题
在Directshow中,我们可以对render指定显示窗口,在写程序的过程中, 发现通过put_Owner设置的显示窗口存在自动刷新问题,譬如窗口被遮挡然后再次露出时,被遮挡部分不能自动刷新,需要拖 ...
- iframe,window,滚动栏的一些问题
1.Iframe不显示边框:frameborder=0 2.Iframe不显示横向滚动栏:在iframe所指向的页面增加: <style> html{overflow-x:hidden;} ...
- 使用storyboard实现页面跳转,简单的数据传递
由于最近才接触到IOS,苹果已经建议storyboard来搭建所有界面了,于是我 也追随时尚,直接开始使用storyboard.(不料在涉及到页面跳转的时候,遇到的问题是:点击后没有任何反应)众所周知 ...
- Java--格式化输出
Java的格式化输出等同于String.Format,与C有很大的相似,比如 System.out.printf("%8.2f", x); 在printf中,可以使用多个参数,例如 ...
- iOS开发之iOS7设置状态栏字体颜色
应用中登陆界面颜色较浅,状态栏字体颜色为黑色,跳转到主界面之后,界面颜色较深,状态栏颜色随之变成白色.但是再重新返回登陆界面后,状态栏字体颜色并没有改成黑色,特别别扭. plist文件里将View c ...