成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

erget源碼分析(3):生命周期

Hydrogen / 956人閱讀

摘要:概述下面我們來分析一下中的生命周期。定義了監(jiān)聽生命周期的類,這個三個成員方法分別執(zhí)行暫停繼續(xù)和刷新。方法作為橋梁,接收到具體的類型的函數(shù),創(chuàng)建的一個實例作為參數(shù)調(diào)用它。函數(shù)做了兩件事情暫停應用程序,暫停背景音樂和音效的播放。

概述

下面我們來分析一下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定義了監(jiān)聽生命周期的類,pause(),resume(),update()這個三個成員方法分別執(zhí)行暫停、繼續(xù)和刷新。LifecyclePlugin定義了一個監(jiān)聽應用程序狀態(tài)變化的函數(shù)類型,它有一個類型為LifecycleContext的context參數(shù)。addLifecycleListener()方法創(chuàng)建了LifecycleContext的一個實例,把這個實例作為參數(shù)調(diào)用了傳入的plugin()方法。
這樣看好像有點亂,我們梳理一下。

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

因為不同平臺監(jiān)聽應用程序狀態(tài)變化的實現(xiàn)不同(Native平臺要應用到原生接口,Web使用一些Javascript的API),它們的共同點是要用到LifecycleContext的一個實例,在對應的監(jiān)聽實現(xiàn)代碼里去調(diào)動這個實例的pause(),resume(),update()這三個方法去暫停、繼續(xù)和刷新應用程序,所以定義了LifecyclePlugin這個函數(shù)類型。

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

addLifecycleListener()方法作為橋梁,接收到具體的LifecyclePlugin類型的函數(shù),創(chuàng)建LifecycleContext的一個實例作為參數(shù)調(diào)用它。

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語言的作用是防止重復觸發(fā)暫停事件,如果觸發(fā),主要做了兩件事情,一個是向全局事件系統(tǒng)觸發(fā)了一個Event.DEACTIVATE類型的事件(關(guān)于全局事件系統(tǒng)在后面的章節(jié)中具體分析)。一個是調(diào)用了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()方法,這個方法只有一行,執(zhí)行了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平臺監(jiān)聽函數(shù)定義了原生平臺的兩個方法egret_native.pauseApp()和egret_native.resumeApp()。pauseApp()函數(shù)做了兩件事情:暫停應用程序,暫停背景音樂和音效的播放。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()這個函數(shù)。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/92847.html

相關(guān)文章

  • erget源碼分析(2):全局哈?;惡腿之惒胶瘮?shù)對象接口

    摘要:異步函數(shù)對象接口,包含和兩個成員方法。哈希計數(shù)在整個的源碼中都沒有找到和方法的調(diào)用,這兩個方法的具體作用是在原生中實現(xiàn)類式繼承和私有屬性一類的功能。 文件結(jié)構(gòu) utils/HashObject.ts文件:showImg(https://segmentfault.com/img/bVZpuq?w=642&h=472); 首先解釋一下文件結(jié)構(gòu)圖 __extends方法 通過原型對象模擬類...

    godlong_X 評論0 收藏0
  • erget源碼分析(1):入口文件分析

    摘要:是一個靜態(tài)類,調(diào)用方法來初始化各項支持信息。小結(jié)通過和這兩個靜態(tài)類初始化了項目運行的環(huán)境參數(shù),然后創(chuàng)建了屏幕適配器根據(jù)不同的適配策略調(diào)整。下一篇源碼分析全局哈?;惡腿之惒胶瘮?shù)對象接口 egret的github地址是https://github.com/egret-labs...,大家自己git clone到本地。 一.路口html文件 用ergetWing新建一個工程,打開根目錄下...

    Rainie 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<