背景音乐的播放与中止实例代码以下:
php
[html] view plaincopyhtml
SimpleAudioEngine::getInstance()->playBackgroundMusic("sound/Jazz.mp3", true); 函数
SimpleAudioEngine::getInstance()->stopBackgroundMusic("sound/Jazz.mp3"); 动画
背景音乐的播放代码放置到什么地方比较适合呢?例如:在Setting场景中,主要代码以下:网站
[html] view plaincopyspa
bool Setting::init() .net
{ orm
//播放代码 ① htm
return true; blog
}
void Setting::onEnter()
{
Layer::onEnter();
log("Setting onEnter");
//播放代码 ②
}
void Setting::onEnterTransitionDidFinish()
{
Layer::onEnterTransitionDidFinish();
log("Setting onEnterTransitionDidFinish");
//播放代码 ③
}
void Setting::onExit()
{
Layer::onExit();
log("Setting onExit");
}
void Setting::onExitTransitionDidStart()
{
Layer::onExitTransitionDidStart();
log("Setting onExitTransitionDidStart");
}
void Setting::cleanup()
{
Layer::cleanup();
log("Setting cleanup");
}
关于播放背景音乐,理论上咱们是能够将播放代码SimpleAudioEngine::getInstance()->playBackgroundMusic("sound/Synth.mp3",true)放置到三个位置(代码中的①、②、③)。下面咱们分别分析一下它们还有什么不一样。
一、代码放到第①行
代码放到第①行(即在Setting::init函数),若是前面场景中没有调用背景音乐中止语句,则能够正常播放背景音乐。可是若是前面场景层HelloWorld::onExit函数有调用背景音乐中止语句,那么会出现背景音乐播放几秒钟后中止。
为了解释这个现象,咱们能够参考一下6.3.2一节多场景切换生命周期。使用pushScene函数从实现HelloWorld场景进入Setting场景,生命周期函数调用顺序以下图所示。
从图中可见,HelloWorld::onExit调用是在Setting::init以后,这样当咱们在Setting::init中开始播放背景音乐后,过一会调用HelloWorld::onExit中止背景音乐播放,这样问题就出现了。
注意 不管播放和中止的是不是同一个文件,都会出现个问题。
二、代码放到第②行
代码放到第②行(即在Setting::onExit函数),若是前面场景中没有调用背景音乐中止语句,则能够正常播放背景音乐。若是前面的场景层HelloWorld::onExit函数有背景音乐中止语句,也会出现背景音乐播放几秒钟后中止。缘由与代码放到第①行状况同样。
三、代码放到第③行
咱们推荐代码放到第③行代码位置,由于onEnterTransitionDidFinish函数是在进入层并且过渡动画结束时候调用,代码放到这里不用考虑中前面场景是否有调用背景音乐中止语句。并且用户也不会先听到声音,后出现界面现象。
综上所述,是否可以成功播放背景音乐,前面场景是否有调用背景音乐中止语句有关,也与当前场景中播放代码在哪一个函数里有关。若是前面场景没有调用背景音乐中止语句,问题也就简单了,咱们能够将播放代码放置在代码①、②、③任何一处。可是若是前面场景调用背景音乐中止语句,在onEnterTransitionDidFinish函数播放背景音乐会更好一些。
更多内容请关注Cocos2d-x系列图书《Cocos2d-x实战(卷Ⅰ):C++开发》
本书交流讨论网站:http://www.cocoagame.net
欢迎加入cocos2d-x技术讨论群:25776038六、327403678