热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

erget源码剖析(3):生命周期

概述下面我们来剖析一下erget中的生命周期。srcegretplayerSystemTicker.ts:exportnamespacelifecycle{exporttypeLi
概述

下面我们来剖析一下erget中的生命周期。

src/egret/player/SystemTicker.ts:

export namespace lifecycle {
export type LifecyclePlugin = (context: LifecycleContext) => void;
/**
* @private
*/
export let stage: egret.Stage;
/**
* @private
*/
export let contexts: LifecycleContext[] = [];
let isActivate = true;
export class LifecycleContext {
pause() {
if (isActivate) {
isActivate = false;
stage.dispatchEvent(new Event(Event.DEACTIVATE));
if (onPause) {
onPause();
}
}
}
resume() {
if (!isActivate) {
isActivate = true;
stage.dispatchEvent(new Event(Event.ACTIVATE));
if (onResume) {
onResume();
}
}
}
onUpdate?: () => void;
}
export let onResume: () => void;
export let onPause: () => void;
export function addLifecycleListener(plugin: LifecyclePlugin) {
let cOntext= new LifecycleContext();
contexts.push(context);
plugin(context);
}
}

LifecycleContext定义了监听生命周期的类,pause(),resume(),update()这个三个成员要领离别实行停息、继承和革新。LifecyclePlugin定义了一个监听应用程序状况变化的函数范例,它有一个范例为LifecycleContext的context参数。addLifecycleListener()要领建立了LifecycleContext的一个实例,把这个实例作为参数调用了传入的plugin()要领。
如许看彷佛有点乱,我们梳理一下。

剖析

type LifecyclePlugin

export type LifecyclePlugin = (context: LifecycleContext) => void;

由于差别平台监听应用程序状况变化的完成差别(Native平台要应用到原生接口,Web运用一些Javascript的API),它们的共同点是要用到LifecycleContext的一个实例,在对应的监听完成代码里去变更这个实例的pause(),resume(),update()这三个要领去停息、继承和革新应用程序,所以定义了LifecyclePlugin这个函数范例。

function addLifecycleListener

export function addLifecycleListener(plugin: LifecyclePlugin) {
let cOntext= new LifecycleContext();
contexts.push(context);
plugin(context);
}

addLifecycleListener()要领作为桥梁,接收到详细的LifecyclePlugin范例的函数,建立LifecycleContext的一个实例作为参数调用它。

class LifecycleContext

let isActivate = true;
export class LifecycleContext {
pause() {
if (isActivate) {
isActivate = false;
stage.dispatchEvent(new Event(Event.DEACTIVATE));
if (onPause) {
onPause();
}
}
}
resume() {
if (!isActivate) {
isActivate = true;
stage.dispatchEvent(new Event(Event.ACTIVATE));
if (onResume) {
onResume();
}
}
}
onUpdate?: () => void;
}
export let onResume: () => void;
export let onPause: () => void;

isActivate作为一个布尔值范例的成员属性用来标记当前是不是停息,这个if言语的作用是防备反复触发停息事宜,假如触发,重要做了两件事变,一个是向全局事宜体系触发了一个Event.DEACTIVATE范例的事宜(关于全局事宜体系在后面的章节中详细剖析)。一个是调用了onPause()要领。我们在egret-core/tools/templates/game/src/Main.ts中找到这几行

private onAddToStage(event: egret.Event) {
egret.lifecycle.addLifecycleListener((context) => {
// custom lifecycle plugin
context.OnUpdate= () => {
console.log('hello,world')
}
})
egret.lifecycle.OnPause= () => {
egret.ticker.pause();
}
egret.lifecycle.OnResume= () => {
egret.ticker.resume();
}
//设置加载进度界面
//......
//初始化Resource资本加载库
//......
}
/**
* 心跳计时器单例
*/
export let ticker: sys.SystemTicker = new sys.SystemTicker();

这里耽误定义了onPause()要领,这个要领只要一行,实行了egret.ticker.pause()要领。resume()要领相似pause()要领。

运用例子

Web平台

Native平台

egret-core/src/egret/native/NativeHideHandler.ts:

namespace egret.native {
/**
* @private
*/
export let NativeLifeCycleHandler: egret.lifecycle.LifecyclePlugin = (context) => {
egret_native.pauseApp = () => {
context.pause();
egret_native.Audio.pauseBackgroundMusic();
egret_native.Audio.pauseAllEffects();
};
egret_native.resumeApp = () => {
context.resume();
egret_native.Audio.resumeBackgroundMusic();
egret_native.Audio.resumeAllEffects();
};
}
}

这个Native平台监听函数定义了原生平台的两个要领egret_native.pauseApp()和egret_native.resumeApp()。pauseApp()函数做了两件事变:停息应用程序,停息背景音乐和音效的播放。resumeApp()相似。

egret-core/src/egret/native/NativePlayer.ts:

namespace egret.native {
/**
* @private
*/
export class NativePlayer extends egret.HashObject implements egret.sys.Screen {
//...
private init(option: PlayerOption): void {
//...
lifecycle.addLifecycleListener(NativeLifeCycleHandler);
//...
}
//...
}
}

这里应用addLifecycleListener()要领绑定了NativeLifeCycleHandler()这个函数。


推荐阅读
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • Webpack5内置处理图片资源的配置方法
    本文介绍了在Webpack5中处理图片资源的配置方法。在Webpack4中,我们需要使用file-loader和url-loader来处理图片资源,但是在Webpack5中,这两个Loader的功能已经被内置到Webpack中,我们只需要简单配置即可实现图片资源的处理。本文还介绍了一些常用的配置方法,如匹配不同类型的图片文件、设置输出路径等。通过本文的学习,读者可以快速掌握Webpack5处理图片资源的方法。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • javascript  – 概述在Firefox上无法正常工作
    我试图提出一些自定义大纲,以达到一些Web可访问性建议.但我不能用Firefox制作.这就是它在Chrome上的外观:而那个图标实际上是一个锚点.在Firefox上,它只概述了整个 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 从零学Java(10)之方法详解,喷打野你真的没我6!
    本文介绍了从零学Java系列中的第10篇文章,详解了Java中的方法。同时讨论了打野过程中喷打野的影响,以及金色打野刀对经济的增加和线上队友经济的影响。指出喷打野会导致线上经济的消减和影响队伍的团结。 ... [详细]
  • 3.223.28周学习总结中的贪心作业收获及困惑
    本文是对3.223.28周学习总结中的贪心作业进行总结,作者在解题过程中参考了他人的代码,但前提是要先理解题目并有解题思路。作者分享了自己在贪心作业中的收获,同时提到了一道让他困惑的题目,即input details部分引发的疑惑。 ... [详细]
author-avatar
mobiledu2502921107
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有