码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2017-09-22 13:02:16      阅读:1536      评论:0      收藏:0      [点我收藏+]

标签:ref   ret   str   sed   参与   develop   文件   标志位   evel   

官网教程-生命周期: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 )

标签:ref   ret   str   sed   参与   develop   文件   标志位   evel   

原文地址:http://www.cnblogs.com/gamedaybyday/p/7574153.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!