cocos2dx基础篇(15)——⾳乐⾳效SimpleAudioEngine
【唠叨】
本节⽐较简单,主要讲讲cocos2dx引擎中的⾳乐⾳效SimpleAudioEngine。
【致谢】
【⼩知识】
单例类:说的通俗⼀点,它就是⼀个全局静态类。第⼀次调⽤时会创建⼀个全局静态对象,整个游戏的运⾏过程中会⼀直存在,全局都可
以访问。
【Demo下载】
【3.x】
(1)获取单例:sharedEngine()改为getInstance()
(2)实现了:⾳量的调节。
(3)修改了播放⾳效playEffect()的参数:
//
//现在还不能完全⽀持所有参数,限制的功能如下:
//在SamsungGalaxyS2上如果启⽤了OpenSL那么pitch参数⽆效;
//在emscrippten,win32,marmalade上pitch/pan/gain参数⽆效
virtualunsignedintplayEffect(
constchar*pszFilePath,//⾳效⽂件的路径
boolbLoop=fal,//是否循环播放,默认为fal,不循环
floatpitch=1.0f,//频率,正常情况下为1.0,在播放时也可以改变该值
floatpan=0.0f,//声道,范围为-1到1,为-1时表⽰只有左声道,为1时表⽰只有右声道
floatgain=1.0f//⾳量增益,范围为0到1,默认值为1
)
//
(4)其他变化不⼤。
【SimpleAudioEngine】
⾳乐⾳效是每个游戏中不可或缺的部分,⼀个好的声⾳会给玩家留下深刻的印象,当⼀听到游戏的声⾳,就会不⾃觉得说出游戏的名称
来。就像《中国好声⾳》⼀样,笔者对那⾸《斑马,斑马》印象就⾮常深刻,当然唱这⾸歌的那个妹⼦也不错。
好了,不扯了,继续学习……
1、⾳乐⾳效介绍
声⾳分为两类:背景⾳乐、⾳效。
(1)背景⾳乐:⼀般是贯穿整个游戏的⾳乐,时间长、重复次数少。
(2)⾳效:⼀般是很短的那种声⾳特效,如砍杀、爆炸、⾛路等,短暂但使⽤⽐较频繁。
cocos2dx是⼀个跨平台的游戏引擎,它⽀持多种声⾳格式(⽐如MP3、WAV等)。可是呢,对于不同的平台,声⾳的格式可不⼀定是
统⼀的。这就需要⼤家根据不同的平台,选择合适的声⾳格式了。
根据两种声⾳的特点,其采⽤的声⾳格式也有所不同。以下列出各平台所推荐的声⾳格式(当然并不是全部⽀持的格式,如IOS中背景⾳
乐除了MP3和CAF外,还可以使⽤AAC、AMR等等)。
背景⾳乐⾳效
Win32MP3、MID、WAVMID、WAV
AndroidMP3、MID、WAVOGG
IOSMP3、CAFCAF
由此可见,背景⾳乐最适合的选择是MP3格式。虽然⾳效也可以使⽤MP3格式,但是MP3是⼀种有损的压缩格式,⽽⾳效多数是短暂⽽
快速的声响,有损的压缩⽅式可能导致有些采样⾳源消失,故⾳效不推荐使⽤MP3格式。⽽每个平台的⾳效格式均不相同,故需要根据不
同平台,选⽤合适的格式。
2、SimpleAudioEngine
cocos2dx为我们提供了声⾳模块CocosDenshion。⽽其中有个SimpleAudioEngine类,是我们学习研究的对象。
使⽤SimpleAudioEngine时需要引⼊头⽂件和命名空间:
//
#include"SimpleAudioEngine.h"
usingnamespaceCocosDenshion;
//
SimpleAudioEngine和CCDirector⼀样,也是⼀个单例类。说的通俗⼀点,它就是⼀个全局静态类。第⼀次调⽤时会创建⼀个全局静态
对象,整个游戏的运⾏过程中会⼀直存在,全局都可以访问。
3、获取单例对象
SimpleAudioEngine的单例对象获取⽅法:
//
//通过SimpleAudioEngine::sharedEngine()获得
staticSimpleAudioEngine*sharedEngine();
//
4、背景⾳乐的函数
相关操作:预加载、播放、停⽌、暂停、恢复、重播,以及设置⾳量等。
//
voidpreloadBackgroundMusic('⾳乐路径constchar*');//预加载
voidplayBackgroundMusic('⾳乐路径constchar*',boolbLoop=fal);//播放,是否循环,默认不循环
voidstopBackgroundMusic(boolbReleaData=fal);//停⽌,是否释放⾳乐资源
voidpauBackgroundMusic();//暂停
voidresumeBackgroundMusic();//恢复
voidrewindBackgroundMusic();//重播
//返回是否将要播放背景⾳乐
boolwillPlayBackgroundMusic();
//返回是否正在播放背景⾳乐
//注意:暂停也算正在播放,只有停⽌了才算未播放。
boolisBackgroundMusicPlaying();
//设置⾳量,取值范围0~1.0
//查看了内部源码,发现⾳量的设置没有实现,即⾳量永远是1.0
floatgetBackgroundMusicVolume();
voidtBackgroundMusicVolume(floatvolume);
//
5、⾳效的函数
相关操作:预加载、播放、停⽌、暂停、恢复、卸载,以及设置⾳量等。
//
voidpreloadEffect('⾳乐路径constchar*');//预加载
unsignedintplayEffect('⾳乐路径constchar*',boolbLoop=fal);//播放,返回该⾳效的ID。是否循环
voidstopEffect(unsignedintnSoundId);//停⽌指定ID的⾳效
voidstopAllEffects();//停⽌所有⾳效
voidpauEffect(unsignedintnSoundId);//暂停指定ID的⾳效
voidpauAllEffects();//暂停所有⾳效
voidresumeEffect(unsignedintnSoundId);//恢复指定ID的⾳效
voidresumeAllEffects();//恢复所有⾳效
voidunloadEffect(constchar*pszFilePath);//卸载⾳效资源
//设置⾳量,取值范围0~1.0
//查看了内部源码,发现⾳量的设置没有实现,即⾳量永远是1.0
floatgetEffectsVolume();
voidtEffectsVolume(floatvolume);
//
6、关于预加载
加载⾳乐和⾳效通常是⼀个耗时的过程,为了防⽌由即时加载产⽣的延迟导致实际播放与游戏不协调的现象发⽣,在播放⾳效和背景⾳乐
之前,记得要预加载⾳乐⽂件preload。另外需要根据不同的平台,选择不同的预加载⾳乐格式。
具体操作如下:
其中MUSIC_FILE就是⾳乐⽂件相对Resources⽂件夹的相对路径下的⽂件名。
//
/**
*根据平台选择⾳乐⾳效的格式
*/
//⾳效⽂件
//Android平台只⽀持OGG的⾳效格式
#if(CC_TARGET_PLATFORM==CC_PLATFORM_ANDROID)
#defineEFFECT_FILE"music/"
#elif(CC_TARGET_PLATFORM==CC_PLATFORM_MARMALADE)
#defineEFFECT_FILE"music/"
#el
#defineEFFECT_FILE"music/"
#endif
//⾳乐⽂件
#if(CC_TARGET_PLATFORM==CC_PLATFORM_WIN32)
#defineMUSIC_FILE"music/"
#elif(CC_TARGET_PLATFORM==CC_PLATFORM_BLACKBERRY||CC_TARGET_PLATFORM==CC_PLATFORM_LINUX)
#defineMUSIC_FILE"music/"
#elif(CC_TARGET_PLATFORM==CC_PLATFORM_WP8)
#defineMUSIC_FILE"music/"
#el
#defineMUSIC_FILE"music/3"
#endif
/**
*预加载⾳乐⾳效
*/
//加载背景⾳乐
SimpleAudioEngine::sharedEngine()->preloadBackgroundMusic(MUSIC_FILE);
//加载⾳效
SimpleAudioEngine::sharedEngine()->preloadBackgroundMusic(EFFECT_FILE);
//
7、关于⾳量调节
我在测试调节⾳量⼤⼩的时候,惊⼈的发现:cocos2dx中的⾳量设置没有实现,即使你设置了⾳量⼤⼩也没⽤,它永远都是1.0。
所以要想调节⾳量⼤⼩,还是通过设置系统的⾳量吧……
PS:在V3.x中已经实现了⾳量的调节。
源码如下:
//
floatSimpleAudioEngine::getBackgroundMusicVolume()
{
return1.0;
}
voidSimpleAudioEngine::tBackgroundMusicVolume(floatvolume)
{
}
floatSimpleAudioEngine::getEffectsVolume()
{
return1.0;
}
voidSimpleAudioEngine::tEffectsVolume(floatvolume)
{
}
//
8、使⽤技巧
(1)通过SimpleAudioEngine::sharedEngine()获取单例对象,然后调⽤相关函数。
(2)当退出程序时,记得要通过如下函数来释放单例对象,释放所有声⾳资源。
//
SimpleAudioEngine::sharedEngine()->end()
//
(3)加载⾳乐和⾳效通常是⼀个耗时的过程,为了防⽌由即时加载产⽣的延迟导致实际播放与游戏不协调的现象发⽣,在播放⾳效和背
景⾳乐之前,记得要预加载⾳乐⽂件preload。
【代码实战】
代码来源于cocos2dx的官⽅项⽬TestCpp中。
1、资源⽂件
将⾳乐⾳效⽂件资源放在项⽬的“Resourcesmusic”⽬录下。
资源来⾃官⽅项⽬TestCpp中。
2、引⼊头⽂件和命名空间
//
#include"SimpleAudioEngine.h"
usingnamespaceCocosDenshion;
//
3、预加载⾳乐⾳效
//
/**
*根据平台选择⾳乐⾳效的格式
*/
//⾳效⽂件
//Android平台只⽀持OGG的⾳效格式
#if(CC_TARGET_PLATFORM==CC_PLATFORM_ANDROID)
#defineEFFECT_FILE"music/"
#elif(CC_TARGET_PLATFORM==CC_PLATFORM_MARMALADE)
#defineEFFECT_FILE"music/"
#el
#defineEFFECT_FILE"music/"
#endif
//⾳乐⽂件
#if(CC_TARGET_PLATFORM==CC_PLATFORM_WIN32)
#defineMUSIC_FILE"music/"
#elif(CC_TARGET_PLATFORM==CC_PLATFORM_BLACKBERRY||CC_TARGET_PLATFORM==CC_PLATFORM_LINUX)
#defineMUSIC_FILE"music/"
#elif(CC_TARGET_PLATFORM==CC_PLATFORM_WP8)
#defineMUSIC_FILE"music/"
#el
#defineMUSIC_FILE"music/3"
#endif
/**
*预加载⾳乐⾳效
*/
//加载背景⾳乐
SimpleAudioEngine::sharedEngine()->preloadBackgroundMusic(MUSIC_FILE);
//加载⾳效
SimpleAudioEngine::sharedEngine()->preloadBackgroundMusic(EFFECT_FILE);
//
4、创建控制⾳乐⾳效的菜单按钮
⽤菜单按钮来控制⾳乐的播放、暂停、停⽌、恢复等。
//
//创建控制⾳乐⾳效的菜单按钮
std::stringtestItems[]={
"playbackgroundmusic",
"stopbackgroundmusic",
"paubackgroundmusic",
"resumebackgroundmusic",
"rewindbackgroundmusic",
"isbackgroundmusicplaying",
"playeffect",
"playeffectrepeatly",
"stopeffect",
"paueffect",
"resumeeffect",
"paualleffects",
"resumealleffects",
"stopalleffects",
"unloadeffect",
"addbackgroundmusicvolume",
"subbackgroundmusicvolume",
"addeffectsvolume",
"subeffectsvolume"
};
//创建菜单
CCMenu*pMenu=CCMenu::create();
pMenu->tContentSize(CCSizeMake(480,1000));
for(inti=0;i<19;++i)
{
CCLabelTTF*label=CCLabelTTF::create(testItems[i].c_str(),"Arial",24);
CCMenuItemLabel*pMenuItem=CCMenuItemLabel::create(label,this,menu_lector(HelloWorld::menuCallback));
pMenuItem->tPosition(ccp(/2,1000-(i+1)*50));
pMenu->addChild(pMenuItem,0,i);
}
//将菜单作为容器,放⼊滚动视图中
CCScrollView*scrollView=CCScrollView::create(CCSizeMake(480,320),pMenu);
scrollView->tDirection(kCCScrollViewDirectionVertical);
scrollView->tPosition(CCPointZero);
pMenu->tPosition(ccp(0,320-1000));
this->addChild(scrollView);
//
5、编写菜单按钮回调函数
根据点击的菜单项Tag,来控制⾳乐⾳效。
//
voidHelloWorld::menuCallback(CCObject*nder)
{
//获取菜单按钮编号
intidx=((CCMenuItem*)nder)->getTag();
switch(idx)
{
//⾳乐控制
ca0:SimpleAudioEngine::sharedEngine()->playBackgroundMusic(MUSIC_FILE,true);break;//播放⾳乐,循环
ca1:SimpleAudioEngine::sharedEngine()->stopBackgroundMusic();break;//停⽌⾳乐
ca2:SimpleAudioEngine::sharedEngine()->pauBackgroundMusic();break;//暂停⾳乐
ca3:SimpleAudioEngine::sharedEngine()->resumeBackgroundMusic();break;//恢复⾳乐
ca4:SimpleAudioEngine::sharedEngine()->rewindBackgroundMusic();break;//重播⾳乐
ca5:
if(SimpleAudioEngine::sharedEngine()->isBackgroundMusicPlaying())//是否正在播放背景⾳乐
{
CCLOG("backgroundmusicisplaying");
}
el
{
CCLOG("backgroundmusicisnotplaying");
}
break;
//⾳效控制
ca6:m_soundID=SimpleAudioEngine::sharedEngine()->playEffect(EFFECT_FILE);break;//播放⾳效,不循环
ca7:m_soundID=SimpleAudioEngine::sharedEngine()->playEffect(EFFECT_FILE,true);break;//播放⾳效,循环
ca8:SimpleAudioEngine::sharedEngine()->stopEffect(m_soundID);break;//停⽌指定ID的⾳效
ca9:SimpleAudioEngine::sharedEngine()->pauEffect(m_soundID);break;//暂停指定ID的⾳效
ca10:SimpleAudioEngine::sharedEngine()->resumeEffect(m_soundID);break;//恢复指定ID的⾳效
ca11:SimpleAudioEngine::sharedEngine()->pauAllEffects();break;//暂停所有⾳效
ca12:SimpleAudioEngine::sharedEngine()->resumeAllEffects();break;//恢复所有⾳效
ca13:SimpleAudioEngine::sharedEngine()->stopAllEffects();break;//停⽌所有⾳效
ca14:SimpleAudioEngine::sharedEngine()->unloadEffect(EFFECT_FILE);break;//卸载⾳效
//⾳量控制
ca15:
SimpleAudioEngine::sharedEngine()->tBackgroundMusicVolume(SimpleAudioEngine::sharedEngine()->getBackgroundMusicVolume()+0.1f);
break;
ca16:
SimpleAudioEngine::sharedEngine()->tBackgroundMusicVolume(SimpleAudioEngine::sharedEngine()->getBackgroundMusicVolume()-0.1f);
break;
ca17:
SimpleAudioEngine::sharedEngine()->tEffectsVolume(SimpleAudioEngine::sharedEngine()->getEffectsVolume()+0.1f);
break;
ca18:
SimpleAudioEngine::sharedEngine()->tEffectsVolume(SimpleAudioEngine::sharedEngine()->getEffectsVolume()-0.1f);
break;
}
}
//
6、运⾏结果
声⾳不是视觉效果,所以⾃⼰实现代码后,玩耍去吧!
本文发布于:2023-01-26 12:48:48,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/88/139863.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |