`
ch_kexin
  • 浏览: 877327 次
  • 性别: Icon_minigender_2
  • 来自: 青岛
社区版块
存档分类
最新评论

最近游戏再接入腾讯小游戏, 文档要求 在 QQ切换到后台的时候要停止webgl的渲染,不然在iphone上会崩溃

 
阅读更多

白鹭引擎v2.0+ API

在白鹭引擎2.0+ 版本,通过监听stage对象的egret.Event.ACTIVATEegret.Event.DEACTIVATE事件实现生命周期控制,代码示例如下:

stage.addEventListener(egret.Event.ACTIVATE,()=>{
console.log("app 进入前台");
},this);
stage.addEventListener(egret.Event.DEACTIVATE,()=>{
console.log("app 进入后台");
},this);

 上述方法的缺点是:

  1. 对象的“生命周期”行为与 stage对象耦合。
  2. 由于一些 HTML5 游戏的运行环境(比如手机QQ等)设置了独有的 API 而非 HTML5 标准 API,开发者难以对白鹭引擎的底层进行自定义扩展。

白鹭引擎v4.1+ API

白鹭引擎 4.1 版本引入生命周期管理器:egret.lifecycle。其代码示例如下:

egret.lifecycle.onPause = ()=> {
console.log("app 进入后台");
egret.ticker.pause(); // 关闭渲染与心跳
}
egret.lifecycle.onResume = ()=> {
console.log("app 进入前台");
egret.ticker.resume(); // 打开渲染与心跳
}

 针对不同的游戏运行环境,开发者可以对生命周期管理器进行扩展,以手机QQ举例,其扩展如下:

// 手机QQ注册了 appInBackgound 这一变量,在 TypeScript 中进行声明,防止报错
declare interface Window {
appInBackgound:boolean;
}
egret.lifecycle.addLifecycleListener( (context)=>{
// 方法一:通过事件监听的方式进行通知
document.addEventListener("qbrowserVisibilityChange", function(e:any){
if (e.hidden){
context.pause();
}
else{
context.resume();
};
});
// 方法二:在每一帧进行判断
context.onUpdate = ()=> {
if (window.appInBackgound){
context.pause();
}
else{
context.resume();
}
}
} )

 完整Demo:

  /* 初始化事件 */
    private initLifecycle(): void {
        egret.lifecycle.addLifecycleListener((context) => {
            // custom lifecycle plugin
            document.addEventListener("visibilitychange", function (e) {
                // document.title = document.hidden ? "用户离开了" : "用户回来了";
                if (document.hidden) {
                    // 网页被挂起 ---- 暂停音乐
                    console.log(" 网页被挂起");
                    context.pause();
                }
                else {
                    // 网页被呼起 ---- 播放音乐
                    console.log(" 网页被呼起");
                    context.resume();
                }
                console.log(document);
                console.log(e);
            });
            document.addEventListener("qbrowserVisibilityChange", function (e: any) {
                if (e.hidden) {
                    // 手Q被挂起
                    console.log(" 手Q被挂起");
                    context.pause();
                }
                else {
                    // 手Q被呼起
                    console.log(" 手Q被呼起");
                    context.resume();
                };
            });
            context.onUpdate = () => {
            }
        })
        egret.lifecycle.onPause = () => {
            console.log("APP 进入后台");
            StageReferance.stage.frameRate = 0.01;
            egret.ticker.pause(); // 关闭渲染与心跳
            SoundMusic.stop();
        }
        egret.lifecycle.onResume = () => {
            console.log("APP 进入前台");
            StageReferance.stage.frameRate = 30;
            egret.ticker.resume(); // 打开渲染与心跳
            SoundMusic.resume();
        }
    }

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics