自己動手寫框架的話,UI管理器是最基礎的一部分;
打開界底層是addChild打開的;
新建一個UIManager
export class UIManager {
private mainContent: Laya.Sprite;
private scene: GameScence;
private uiList:any[];
constructor() {
this.mainContent = new Laya.Sprite();
this.uiList = [];
}
}
mainContent 為默認添加到的層級,
GameScence 為UI管理器默認場景
uiList放所有加載進來的場景
第一步實現 打開界面 openWindow
public openWindow(clazz: any, param?: { data?: any }) {
let view = new clazz()
this.setView(clazz, view);
this.mainContent.addChild(view);
}
初始化傳進來的場景類;
存進字典
添加到顯示層
下面是緩存的過程 setView
private setView(clazz: any, view:Laya.Node):void{
let v: Laya.Node = this.getView(clazz);
if(!v){
let uiData = {clazz: clazz, view: view};
this.uiList.push(uiData);
}
}
首先判斷本地緩存有沒有,有的話 不處理,沒得話,創建,push到數組中
private getView(clazz: any):Laya.Node{
for(let i:number =0 ; i<this.uiList.length ; i++){
let uiData = this.uiList[i];
if(uiData.clazz == clazz){
return uiData.view;
}
}
}
根據clazz名字獲取本地緩存的場景類
下面是關閉場景,
public closeWindow(clazz: any): void {
let v = this.getView(clazz);
let index: number = this.getViewIndex(clazz);
if(v){
v.removeSelf();
this.uiList.splice(index,1);
}
}
private getViewIndex(clazz: any):number{
for(let i:number =0 ; i<this.uiList.length ; i++){
let uiData = this.uiList[i];
if(uiData.clazz == clazz){
return i;
}
}
return -1;
}
這就是最簡單的打開和關閉;
還要有一個初始化UIManager的方法, 設置管理器的初始化場景
public setGameScene(gameScene: GameScence): void {
this.scene = gameScene;
if (this.scene) {
this.scene.parent.addChild(this.mainContent);
}
}
export let ui: UIManager = new UIManager(); window["ui"] = ui;
有時候通過open方法,或者UiManager打開一個場景后,場景里面的元素還不能正常獲取;解決辦法是
修改Node Sprite的原型, 那么,所有的場景被加載時,都會執行這些方法,
import { LogUtil } from "../util/LogUtil";
/**
* 為基類定義若干方法
*/
export class PatchManager{}
(function(){
let _proto:any;
_proto = Laya.Scene.prototype;
_proto.createView = function(view:Object){
if (view && !this._viewCreated) {
this._viewCreated = true;
Laya.SceneUtils.createByData(this, view);
}
this.onInit();
this.onShow();
Laya.timer.frameLoop(1, this, ()=>{
// console.info(this);
this.onUpdate();
});
}
/********************************************************************************
* Node
********************************************************************************/
_proto = Laya.Node.prototype;
_proto.onInit = function(){
}
_proto.onShow = function(){
}
_proto.onUpdate = function(){
}
_proto.onDisable=function(){
this.onHide();
}
_proto.onHide = function(){
}
})();
在場景中 直接寫 onShow () {} 界面被加載完成后, 會自動調用這個方法、。
搞定。
