溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Egret場景切換管理類切換和單例使用方法

發(fā)布時間:2020-07-29 14:04:02 來源:網絡 閱讀:1803 作者:Egret_SJ 欄目:開發(fā)技術

場景切換是很多開發(fā)者在開發(fā)過程中必不可少的一個環(huán)節(jié),當項目中有兩個或兩個以上的游戲場景時,怎樣管理這些場景,能夠使它們之間的切換更加方便呢?今天就為大家介紹場景切換管理類的切換方法和單例的使用方法。

案例源碼:https://github.com/hkjlx/qhcj

首先創(chuàng)建一個所有場景的父類Scene

Scene類主要是為了方便管理場景,此類是一個抽象類,子類必須繼承此類并實現(xiàn)onComplete()抽象方法才能進行場景的切換。

abstract class Scene extends eui.Component{
    public constructor() {
        super();
        // 監(jiān)聽組件創(chuàng)建完畢 也就是場景的外觀創(chuàng)建完畢
        this.addEventListener(eui.UIEvent.CREATION_COMPLETE,this.onComplete,this);
    }
     protected abstract onComplete();
}

場景管理器SceneManger

所有場景的切換,彈出關閉都是由SceneManger類來控制,這樣方便對場景進行統(tǒng)一管理。

1.使用單例模式

SceneManger類需要使用到單例模式,單例模式是一種常用的軟件設計模式,其定義是單例對象的類只能允許一個實例存在。

class SceneManager {
    private static _manager:SceneManager;
    public static get Instance(){
        if( SceneManager._manager==null){
            SceneManager._manager = newSceneManager();
        }
        return SceneManager._manager;
    }
    public constructor() {
    }
}

2.控制場景切換的方法

changeScene()方法:當舞臺上有場景時,會先將當前場景從舞臺移除,再添加新場景到舞臺上;當舞臺還沒有場景時,會直接添加到舞臺上。

 public rootLayer:eui.UILayer;//起始場景
    private currentScene:Scene;//需要顯示的場景
    private pop_scene:Scene;//彈出場景層
    //切換場景
    public changeScene(s:Scene){
        if(this.currentScene){
           this.rootLayer.removeChild(this.currentScene);
            this.currentScene = null;
        }
        this.rootLayer.addChild(s);
        this.currentScene = s;
    }

3.彈出場景和關閉彈出場景

彈出場景不會使底層場景消失,而是直接在當前場景上再顯示一個場景出來(主要用于設置面板之類的)。

在彈出場景時先調用了一次關閉場景層,防止還沒關閉場景層又點擊了彈出場景層。

//彈出場景層
    public pushScene(s:Scene){
        this.popScene();
        if(!this.pop_scene){
            this.rootLayer.addChild(s);
            this.pop_scene = s;
        }
    }
    //關閉場景層
    public popScene(){
        if(this.pop_scene){
            this.rootLayer.removeChild(this.pop_scene);
            this.pop_scene = null;
        }
    }

在入口文件 Main.ts 中引入場景管理類 SceneManage

首先將Main.ts中createGameScene()方法中的代碼刪掉,再調用下面的方法,將this定為起始場景(舞臺)。

SceneManager.Instance.rootLayer = this;


使用eui創(chuàng)建三個場景和一個彈出場景

使用eui創(chuàng)建三個場景,分別為:開始場景(StartScene.exml),游戲場景(GameScene.exml),結束場景(EndScene.exml)。

下圖示例為開始場景(StartScene.exml):

Egret場景切換管理類切換和單例使用方法

使用eui創(chuàng)建彈出層(TanChu.exml)。

下圖示例為彈出場景:

Egret場景切換管理類切換和單例使用方法

eui文件創(chuàng)建完成之后需在終端中輸入egret build編譯項目,這時會在default.thm.json 文件中生成皮膚對應的skinName。

Egret場景切換管理類切換和單例使用方法

開始場景(StartScene.ts)、游戲場景(GameScene.ts),結束場景(EndScene.ts)對應的TS文件

由于StartScene類繼承自Scene抽象類,所以在此類中必須得實現(xiàn)onComplete()方法,示例代碼如下:

class StartScene extends Scene {
        public btn_tc: eui.Label;//彈出層按鈕
        public btn_qh3: eui.Label;//切換場景

        public constructor() {
            super();
            //指定開始場景對應的皮膚文件StartScene.exml
            this.skinName ="resource/game/StartScene.exml";
        }
        //實現(xiàn)父類的onComplete方法
        protected onComplete() {
            //設置兩個Label為可點擊
            this.btn_tc.touchEnabled =true;
            this.btn_qh3.touchEnabled =true;
            //添加點擊事件
           this.btn_tc.addEventListener(egret.TouchEvent.TOUCH_TAP, this.onTaptc,this);
            this.btn_qh3.addEventListener(egret.TouchEvent.TOUCH_TAP,this.onTapqiehuan, this);
        }
        //彈出場景
        private onTaptc(){
        }
        private onTapqiehuan(){
        }
}

游戲場景(GameScene),結束場景(EndScene)對應的ts文件基本與開始場景一致。

可參考源碼:https://github.com/hkjlx/qhcj

游戲初始化時在Main.ts中的createGameScene()方法添加開始游戲場景(StartScene),切換場景時調用SceneManager.Instance.changeScene()即可;注意:此處參數為一個場景實例。

let s1:StartScene = new StartScene();
SceneManager.Instance.changeScene(s1);

彈出場景層方法

在對應的點擊事件中調用pushScene()方法。

let tc:Tanchu = new Tanchu();
SceneManager.Instance.pushScene(tc);//添加場景彈出層

如果需要關閉彈出場景層,在彈出場景層的類中調用popScene()方法。

SceneManager.Instance.popScene();//移除場景層

小結

本文主要講解了場景切換管理類的切換方法和單例的使用方法,有任何技術問題或者覺得這篇文章對你有所幫助,歡迎留言與我們交流互動!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI