QQ轻游戏貌似已经暂缓更新了?
最近两个月qqPlayCore.js貌似都没有更新新的版本
在这个时候处理qqplay的坑。。。还是得手撕源码
音频的问题众多版本都有出现
我这个项目特殊之处在于Creator版本是1.10已经没有升级(大约18年7、8月的版本)
而当时Creator所对应qqPlayCore.js缺少很多功能,banner和视频激励都没有
换最新的qqPlayCore.js之后音频就开始出问题
问题主要有两个方面
1.前后台切换时,回到前台会导致全部曾经播放过的音乐和音效复播
2.音乐音效播放8次后,就不再播了,整个游戏变静音
第一个问题是qqPlayCore自动复播导致的
BK.onEnterForeground(function () {
_.resumeAllAudio()
}),
BK.onMaximize(function () {
_.resumeAllAudio()
})
在我们的游戏中其实不需要自动复播
因此把resumeAllAudio内容注释掉即可
然后可以手动在前后台切换事件触发时复播音乐
this.bkgame = new BK.Game({
// qqPlayCore 加载完成
onEnterForeground: function (relaunchInfo) {
GLog.d('>>>>>>>>>>>>>>>>>>>>BK.Game.onEnterForeground:' + JSON.stringify(relaunchInfo))
MusicManager.instance.switchMusic(true);
}
})
第二个问题
qqPlayCore中设置了音频上限
MAX_AUDIO_NUM = 8
试了一下直接改值突破上限
发现仍然在播放到15次之后无法播放
估计是h5的音频元素达到了设备浏览器的上限
于是想办法来降低CURRENT_NUM
手动stopMusic/destroy都会销毁音频元素并降低CURRENT_NUM
然而使用当时的cocos方法播放音频
无论play/playMusic/playEffect无循环仅播放一遍完成后
并不会自动调用stopMusic/destroy
必须像手动调用play一样在音频结束后手动调用stop
为此可能还要注册一个事件,非常的麻烦
于是我就修改了qqPlayCore代码在循环完毕后自动destroy
r.prototype.loopPlay = function (e, i) {
if (void 0 !== this.audioObject) {
var r = this;
0 < --e && this.audioObject.on(c.ended, function t() {
void 0 !== r.audioObject && (r.audioObject.off(c.ended, t), r.loopPlay(e, i))
}),
e <= 0 && this.audioObject.on(c.ended, function t() {
void 0 !== r.audioObject && (r.audioObject.off(c.ended, t), i && i());
// 新增以下逻辑,循环完毕后立即销毁
r.destroy();
}),
this.audioObject.play()
}
},
总结
BK.Audio对象默认有两种类型
_audioType == 0 表示音乐类型(normal)
_audioType == 1 表示音效类型(effect)
一开始我以为这里的音乐就对应游戏中的背景音乐,音效就对应游戏中的音效
然而实际上并不是这样
音效对象会使用单一的音频节点去播放,同一时刻只能播放一个声源文件
因此几乎是没什么用
于是cocos引擎中所使用的playEffect/playMusic一律是按音乐来播的
也正是因此,我们的第一个问题中,全部曾经播放过的音乐和音效复播
其实这里是不区分音乐和音效的,统统都是音效
于是问题的根源就是音频节点未被释放,既导致返回前台时复播,又导致超出系统上限
理论上仅做一处修改即播放完成时立即销毁,就可以解决以上问题
------------------------------------------------
引擎升级至2.1.2
升级了引擎之后不出意外的音频又出现了新的问题
1.qqplay平台不能再直接通过url播放音频,必须先loadRes得到AudioClip再播放
2.es6写法报错,需下载一个文件作为插件解决es6兼容问题
https://google.github.io/traceur-compiler/bin/traceur.js
3.音频播放完成后仍然需要手动停止释放,
而且cc.audioEngine.setFinishCallback在qqplay里并不能得到回调
需要手动根据音频时长注册回调
if(file._audio && typeof file._audio.duration == 'number'){
let duration = file._audio.duration
window.setTimeout(function(){
cc.audioEngine.stop(audioId)
} , duration * 1000)
}
4.文本显示存在偏差
修改了cocos2d-js-min放在build-templates里面
修改以下两个方法
_updateProperties
_calculateFillTextStartPosition