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
_lineHeight = _comp._lineHeight * 1.1;
_calculateFillTextStartPosition
firstLinelabelY *= 1.2;