国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

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

Hydrogen / 925人閱讀

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

概述

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

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

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

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

addLifecycleListener()方法作為橋梁,接收到具體的LifecyclePlugin類型的函數(shù),創(chuàng)建LifecycleContext的一個(gè)實(shí)例作為參數(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作為一個(gè)布爾值類型的成員屬性用來(lái)標(biāo)記當(dāng)前是否暫停,這個(gè)if語(yǔ)言的作用是防止重復(fù)觸發(fā)暫停事件,如果觸發(fā),主要做了兩件事情,一個(gè)是向全局事件系統(tǒng)觸發(fā)了一個(gè)Event.DEACTIVATE類型的事件(關(guān)于全局事件系統(tǒng)在后面的章節(jié)中具體分析)。一個(gè)是調(diào)用了onPause()方法。我們?cè)趀gret-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();
        }


        //設(shè)置加載進(jìn)度界面
        //......

        //初始化Resource資源加載庫(kù)
        //......
    }

    /**
     * 心跳計(jì)時(shí)器單例
     */
    export let ticker: sys.SystemTicker = new sys.SystemTicker();

這里延遲定義了onPause()方法,這個(gè)方法只有一行,執(zhí)行了egret.ticker.pause()方法。resume()方法類似pause()方法。

使用例子 Web平臺(tái) Native平臺(tái)

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();
        };
    }
}

這個(gè)Native平臺(tái)監(jiān)聽函數(shù)定義了原生平臺(tái)的兩個(gè)方法egret_native.pauseApp()和egret_native.resumeApp()。pauseApp()函數(shù)做了兩件事情:暫停應(yīng)用程序,暫停背景音樂和音效的播放。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()這個(gè)函數(shù)。

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/92847.html

相關(guān)文章

  • erget源碼分析(2):全局哈希基類和全局異步函數(shù)對(duì)象接口

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

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

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

    Rainie 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<