cocos2d 多个背景音乐播放

来源:互联网 发布:免费动态域名解析软件 编辑:程序博客网 时间:2024/05/20 23:56
项目中,在播放背景音乐中,我遇到了,播放 music1, music2,先播放music1,等播放完后循环播放music2 。

一开始看到需求的时候,我以为还是很简单的,当我看到 SimpleAudioEngine 并不支持 播放完成后并不没有回调 ,那意味着必须得自己写回调。我想到了二种方案。(大家有什么好办法欢迎留言指出)。
1。延迟播放 譬如 弄一个 delay 播放。
2。在update里面,每一秒 调用 isBackgroundMusicPlaying 判断第一收是否播放完成

然后我选择了 第二种,在每一秒我都会去判断 背景音乐是否还在播放,如果没有播放,则循环播放第二首背景音乐。

然而 却另外发现了个问题,(IOS没有问题,android有),当 如果在刚开始 播放第一首的时候,home键切换到后台,会出现播放第二首,因为 切换后台的某一瞬间,第一首播放暂停了,然后又播放了第二首,第二首却没有调用stop music。导致切换到后台也会继续播放第二首。

这种问题解决办法也是有的。 播放都是调用到了 android 代码。我们可以确定,按 home键的时候,肯定会先调用 pauseBackgroundMusic 在 调用 isBackgroundMusicPlaying 。所以在Cocos2dxMusic.java 中 home 键的调用 pauseBackgroundMusic 暂停 时,我们会标识一个 boolean 类型的变量,默认为 false ,进了 pauseBackgroundMusic 后 值为 true ,当我们在调用 isBackgroundMusicPlaying 时,如果 这个标识为 true 那么 我们完全可以不让它继续往下播放了。记得 从 后台切换到前台的时候 调用 resumeBackgroundMusic ,把标识设置为 false.
我就是这么解决这个问题的。

其实 这种需求 好像有点说不通 是吧。不过 我们又不能违背圣旨。。。

希望对大家有作用。逻辑上的问题都不是问题。如果大家有更好的办法,欢迎留言指导,共勉~

----------------------------------------------分割线-------------------------------------------
SimpleAudioEngine.cpp 里面的方法:

SimpleAudioEngine* getInstance(); //单例

end(); //释放对象

preloadBackgroundMusic(const char* filePath); //缓存背景音乐 (filePath 背景音乐路径)

playBackgroundMusic(const char* filePath, bool loop = false); //播放 (filePath 背景音乐路 径, loop 是否循环播放 默认为 false)

stopBackgroundMusic(bool releaseData = false); // 暂停背景音乐 是否重置数据 默认为 false

pauseBackgroundMusic(); //暂停背景音乐,home键切换到后台必调

resumeBackgroundMusic(); //从暂停处播放,一般都是从后台切换到前台调用

rewindBackgroundMusic(); //重新播放背景音乐

bool willPlayBackgroundMusic(); // 是否能播放背景音乐或者不能播放

bool isBackgroundMusicPlaying(); //背景音乐是否在播放

float getBackgroundMusicVolume(); //获取背景音乐音量大小 最大值为1.0 最小值为 0.0

setBackgroundMusicVolume(float volume); // 设置背景音乐音量大小 最大值为1.0 最小值为 0.

float getEffectsVolume(); //获取音效音量大小 最大值为1.0 最小值为 0.0

setEffectsVolume(float volume); //设置音效音量大小 最大值为1.0 最小值为 0.0

int playEffect(const char* filePath, bool loop = false,
float pitch = 1.0f, float pan = 0.0f, float gain = 1.0f); //播放音效

pauseEffect(unsigned int soundId); //切换到后台暂停播放音效

pauseAllEffects(); //暂停所有音效

resumeEffect(unsigned int soundId); //从暂停处重新播放音效

resumeAllEffects(); //重新播放音效

stopEffect(unsigned int soundId); //暂停音效

stopAllEffects(); //暂停全部音效

preloadEffect(const char* filePath); //缓存加载音效

resumeAllEffects(); //重新播放所有音效

stopEffect(unsigned int soundId); // 暂停音效

stopAllEffects(); // 暂停所有音效

preloadEffect(const char* filePath); //预加载音效

unloadEffect(const char* filePath); //卸载音效

以上就是所有的方法

都很简单,没有什么复杂的。

我想问一个问题,背景音乐居然没有提供一个播放完成的回调,如果有的话,那上面说的哪个问题也就不存在了。。。

此致 共勉~
0 0
原创粉丝点击