Egret置于后台时,暂停游戏逻辑 (Egret 5 )

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Egret置于后台时,暂停游戏逻辑 (Egret 5 )相关的知识,希望对你有一定的参考价值。

官网教程-生命周期:http://developer.egret.com/cn/2d/lifecycle

 

主要是在游戏置于后台时,关闭游戏逻辑、渲染逻辑和背景音乐,保证更好的用户体验。

 

 一 Egret 5.1版本新API

5版本引入了egret.Ticker、egret.lifecycle  API来暂停:

技术分享

 

二 源码位置

egret.ticker就是SystemTicker,同时lifecycle也在SystemTicker.ts 文件里。

技术分享

 

 三 暂停流程

技术分享

 

 

首先在WebLifeCycleHandler里监听window的focus(获得焦点)和blur(没有焦点)事件

技术分享

 

触发时,则调用lifecycle的resume和pause方法。执行定义的onPause和onResume,停止和恢复心跳,再派发ACTIVE和DEACTIVE事件。

技术分享

 

 

四  停止和恢复心跳

egret.Ticker.pause()和egret.Ticker.resume() 用来设置paused标志位。

技术分享

 

 

在startTick中调用update,如果标志位暂停状态,则返回;如果运行状态,则继续执行。

技术分享

 

 

 其他:

1  4.1.0版本如何实现5中的暂停?

 布吉岛

 

2 暂停后动画效果如何运行?

 分别让两个动画在EnterFrame和Tween里执行

EnterFrame:

暂停时动画会停在当前位置,恢复时动画会从当前位置继续执行。

因为EnterFrame事件是根据心跳来计算时间广播的,心跳停止了,那么广播也就停止了。

 

Tween:

测试一个Sprite循环在y轴上运动

 

技术分享

暂停时停在当前位置,恢复时动画会从 (当前时间- 停止时间) 位置继续执行。

比如Tween 1秒走100像素,停止了2秒,则恢复时会从200像素位置开始继续运动。

因为Tween类里的lastTime记录的是停止时间,这个lastTime没有随着系统时间更新而更新,delta随着暂停时间而变大,而delta直接参与了setPosition(delta)。

技术分享

 

粒子动画

未测试

 

MovieClip动画

未测试

 

总结:凡是根据心跳update来更新的动画都会从当前位置停止,从当前位置恢复。

          如果不是,例如Tween,自行记录了lastTime,而这个lastTime不会根据心跳来更新,那么要视具体实现原理分析。

 

 

3 暂停后计时器如何运行?

暂停时,从当前计时位置暂停。

恢复时,从当前计时位置恢复。

例如计时1s执行一次代码,则暂停10s,这10s内不会触发计时器执行任何代码。

恢复时,则会立刻执行一次代码,因为(当前时间 - 停止时间) = 10秒 > 1秒 ,会立刻触发一次TIMER事件。

 

4 暂停后服务器发送的事件会有什么影响?

 

 

 

 

以上是关于Egret置于后台时,暂停游戏逻辑 (Egret 5 )的主要内容,如果未能解决你的问题,请参考以下文章

Html5 Egret游戏开发 成语大挑战一般性二级页面处理

Egret学习-坦克大战开发-总结

Egret白鹭开发微信小游戏分享功能

Egret学习笔记 (Egret打飞机-2.开始游戏)

Egret学习笔记 (Egret打飞机-1.大致思路)

Egret 之 消除游戏 开发 PART 6 Egret elimination game development PART 6