zoukankan      html  css  js  c++  java
  • 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 暂停后服务器发送的事件会有什么影响?

     测试服务端定时1s向客户端发送一个递增数字。

    在暂停时,仍然可接收服务器消息。

     

     

     

  • 相关阅读:
    spark连接MongoDB
    idea+scala+spark遇到的一些问题
    linux环境变量的配置
    sqoop的导入导出
    hive中一些常用的sql语句
    Unity 插件制作笔记(持续更新)
    linux-shutdown命令说明
    linux中的redis缓存服务器
    IceScrum敏捷开发工具的安装文档-官方最新版
    PHP设计模式系列
  • 原文地址:https://www.cnblogs.com/gamedaybyday/p/7574153.html
Copyright © 2011-2022 走看看