-
Creator 版本:2.0.9
-
目标平台: Android
-
详细报错信息,包含调用堆栈:
-
重现方式:调用cc.audioEngine.pauseMusic();cc.audioEngine.stopAllEffects();
-
之前哪个版本是正常的 :
-
手机型号 :
-
手机浏览器 :
-
编辑器操作系统 :
-
编辑器之前是否有其它报错 :
-
出现概率:100%
-
额外线索:
游戏中的音效开关按钮,先是暂停了背景音乐,然后停止所有的音效。之后重新开启音效时,恢复背景音乐。
web是没有问题的,能正确恢复背景音乐。但是在安卓就不能恢复了。
查看了一下web的代码:stopAllEffects: function () {
var musicId = this._music.id;
for (var id in _id2audio) {
var audio = _id2audio[id];
if (!audio || audio.id === musicId) continue;
var state = audio.getState();
if (state === audioEngine.AudioState.PLAYING) {
audio.stop();
}
}
}
这里有正确剔除背景音乐啊。
再查看了一下安卓的代码,发现有这段代码,覆盖了原有的audioEngine.stopAllEffects = function () {
var musicPlaying = audioEngine.getState(_music.id) === audioEngine.AudioState.PLAYING;
var currentTime = audioEngine.getCurrentTime(_music.id);
audioEngine.stopAll();
if (musicPlaying) {
_music.id = audioEngine.play(_music.clip, _music.loop);
audioEngine.setCurrentTime(_music.id, currentTime);
}
};
如果是这样,那应该是我执行顺序的问题,我先暂停了背景音乐导致这里musicPlaying判断为false了。
于是修改了顺序,cc.audioEngine.stopAllEffects();cc.audioEngine.pauseMusic();
这就先停止音效,再暂停背景音乐。
但是现在是变成暂停不了背景音乐了,而且点击暂停的时候背景音反而变大了。
原本我是有控制背景音量的,但现在这里只是把音乐按原本的时间重新播放了。音量是没做处理的,而且在重新播放的同时调用pauseMusic,是不起作用的。我延时0.1秒调用pauseMusic,是可以正确暂停了,但是音量就得重新控制了。
还有这样处理还会引发另外一个问题,就是我已经在自己的控制组件中保存了_music.id,用来控制音量的。然而这里直接就给换了,而我组件里还是记录的旧的。所以音量的控制就没用了。
总结后,我舍弃了这种调用方式,我采用stopAllEffects这里的修改方式,暂停的时候我在组件记录下当前的音乐时间进度,然后恢复的时候,重新播放并调时间到暂停的时间,再设置音量。自己在组件中做背景音乐的控制。完成了原本的功能。
在这里只是想说web版本的stopAllEffects是有剔除_music.id的暂停的,为什么在安卓版本上要覆盖成这样?想请教下是为何意?可以直接去掉这个覆盖,调用原本的stopAllEffects吗?