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向客户端发送一个递增数字。

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

     

     

     

  • 相关阅读:
    USACO Milk2 区间合并
    Codeforces 490B Queue【模拟】
    HDU 3974 Assign the task 简单搜索
    HDU 5119 Happy Matt Friends(2014北京区域赛现场赛H题 裸背包DP)
    Cin、Cout 加快效率方法
    POJ 1159 回文LCS滚动数组优化
    POJ 2479 不相交最大子段和
    POJ 1458 最长公共子序列 LCS
    在阿里最深刻的,还是职场之道给我的震撼
    精细化
  • 原文地址:https://www.cnblogs.com/gamedaybyday/p/7574153.html
Copyright © 2011-2022 走看看