摘要:概述下面我們來分析一下中的生命周期。定義了監聽生命周期的類,這個三個成員方法分別執行暫停繼續和刷新。方法作為橋梁,接收到具體的類型的函數,創建的一個實例作為參數調用它。函數做了兩件事情暫停應用程序,暫停背景音樂和音效的播放。
概述
下面我們來分析一下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()方法。
這樣看好像有點亂,我們梳理一下。
export type LifecyclePlugin = (context: LifecycleContext) => void;
因為不同平臺監聽應用程序狀態變化的實現不同(Native平臺要應用到原生接口,Web使用一些Javascript的API),它們的共同點是要用到LifecycleContext的一個實例,在對應的監聽實現代碼里去調動這個實例的pause(),resume(),update()這三個方法去暫停、繼續和刷新應用程序,所以定義了LifecyclePlugin這個函數類型。
function addLifecycleListenerexport function addLifecycleListener(plugin: LifecyclePlugin) { let context = new LifecycleContext(); contexts.push(context); plugin(context); }
addLifecycleListener()方法作為橋梁,接收到具體的LifecyclePlugin類型的函數,創建LifecycleContext的一個實例作為參數調用它。
class LifecycleContextlet 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()這個函數。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/92847.html
摘要:異步函數對象接口,包含和兩個成員方法。哈希計數在整個的源碼中都沒有找到和方法的調用,這兩個方法的具體作用是在原生中實現類式繼承和私有屬性一類的功能。 文件結構 utils/HashObject.ts文件:showImg(https://segmentfault.com/img/bVZpuq?w=642&h=472); 首先解釋一下文件結構圖 __extends方法 通過原型對象模擬類...
摘要:是一個靜態類,調用方法來初始化各項支持信息。小結通過和這兩個靜態類初始化了項目運行的環境參數,然后創建了屏幕適配器根據不同的適配策略調整。下一篇源碼分析全局哈希基類和全局異步函數對象接口 egret的github地址是https://github.com/egret-labs...,大家自己git clone到本地。 一.路口html文件 用ergetWing新建一個工程,打開根目錄下...
閱讀 2990·2023-04-26 00:23
閱讀 3406·2021-09-13 10:28
閱讀 2185·2021-08-31 14:18
閱讀 2891·2019-08-30 15:54
閱讀 1945·2019-08-30 15:43
閱讀 1284·2019-08-29 16:56
閱讀 2807·2019-08-29 14:16
閱讀 2060·2019-08-28 17:51