import { Asset, Node, Prefab } from "cc"; import { EventMgr } from "../event/EventManager"; import { LoadQueue } from "../res/LoadQueue"; import { StringUtil } from "../util/StringUtil"; import { BaseLayer } from "./BaseLayer"; import { BaseView } from "./BaseView"; //UI类型 export enum LayerType { Game = 0, //游戏层 UI, //UI层 Notice, //公告层 Guide //引导层 } //UI配置结构体 export interface LayerConf { bundle?: string; //BundleName url: string; //资源路径 type: LayerType; //UI类型 anim?: number; //是否使用动画,0:不用动画、1:全屏界面动画、2:弹窗界面动画 cache?: boolean; //是否缓存该UI的资源(该UI动态加载的资源不会缓存) bottom?: boolean; //是否是最底层UI(不受切换影响) preload?: boolean; //是否预加载 special?: boolean; //是否是特殊UI //destroy?: boolean; //关闭时是否销毁 reset?: boolean; } //UI数据 export interface LayerInfo { id: number; view: BaseView; args: any[]; res: Asset; callback: Function; active: Boolean; //是否加载中 bLoading: Boolean; } export class LayerManager { private _game_layer: BaseLayer = null; private _ui_layer: BaseLayer = null; private _notice_layer: BaseLayer = null; private _guide_layer: BaseLayer = null; private _layer_conf: { [key: number]: LayerConf } = {}; private _class_uuid = StringUtil.getUUID(32); constructor(root: Node, conf: any) { this._layer_conf = conf; //预加载资源 for (let id in this._layer_conf) { let conf = this._layer_conf[id]; (conf.preload) && LoadQueue.pushPreload(1, conf.bundle, conf.url, Prefab); //conf.destroy = (conf.destroy) ? conf.destroy : true; } this._game_layer = new BaseLayer("Game_Layer", this._layer_conf); root.addChild(this._game_layer); this._ui_layer = new BaseLayer("UI_Layer", this._layer_conf, true); root.addChild(this._ui_layer); this._notice_layer = new BaseLayer("Notice_Layer", this._layer_conf); root.addChild(this._notice_layer); this._guide_layer = new BaseLayer("Guide_Layer", this._layer_conf); root.addChild(this._guide_layer); EventMgr.addEvent("_Framewrok_Show_GameLayer", (value: boolean) => { // this._game_layer.showLayerUI(value); }, this, this._class_uuid); } /** * 打开UI * @param id UIID * @param callback UI打开成功回调 * @param args 打开UI的可传参数 */ open(id: number, callback: Function = null, ...args: any[]) { // let openState = GameUtil.checkSystemOpen(id) // if (!openState.state) { // Framework.tips.setTips(openState.tips); // return // } let conf = this._layer_conf[id]; // Framework.tips.setTips('huidhkaj shdgk ') if (conf) { //完全打开需要去检测引导手指 let mCallback = () => { // Framework.event.fireEvent(GameEvent.GuideClick_Update_Finger, GuideManager.needShowFinger()); if (callback) { callback(); } }; if (conf.type === LayerType.Game) { this._game_layer.open(id, mCallback, args); } else if (conf.type === LayerType.UI) { this._ui_layer.open(id, mCallback, args); } else if (conf.type === LayerType.Notice) { this._notice_layer.open(id, mCallback, args); } else if (conf.type === LayerType.Guide) { this._guide_layer.open(id, mCallback, args); } return true; } console.error("未找到对应UI:" + id); return false; } /** * 关闭UI * @param ui 待关闭的UI,该值可为id也可为this */ close(ui: number | BaseView) { if (ui) { let id = (typeof ui != "number") ? ui.view_id : ui; let conf = this._layer_conf[id]; if (conf) { if (conf.type === LayerType.Game) { this._game_layer.close(ui); } else if (conf.type === LayerType.UI) { this._ui_layer.close(ui); } else if (conf.type === LayerType.Notice) { this._notice_layer.close(ui); } else if (conf.type === LayerType.Guide) { this._guide_layer.close(ui); } return true; } } return false; } ShowUI(ui, state, callback: Function = null, ...args: any[]) { this._ui_layer.ShowUI(ui, state, callback, args); } /** * 获取UI对应的UIView * @param id UIID */ getUIView(id: number) { let conf = this._layer_conf[id]; if (conf) { if (conf.type === LayerType.Game) { return this._game_layer.getUIView(id); } else if (conf.type === LayerType.UI) { return this._ui_layer.getUIView(id); } else if (conf.type === LayerType.Notice) { return this._notice_layer.getUIView(id); } else if (conf.type === LayerType.Guide) { return this._guide_layer.getUIView(id); } } console.error("未找到对应UI:" + id); return null; } /** * 关闭所有UI */ closeAllUI(withoutID: number = -1) { EventMgr.fireEvent("_Framewrok_Show_GameLayer", true); this._ui_layer.closeAll(withoutID); } closeAllGame(withoutID: number = -1) { this._game_layer.closeAll(withoutID); } }