//UI窗体的父类 /* *功能:定义所有UI窗体的父类 * 定义4个生命周期 * 1,Display //显示状态 * 2,Hiding //隐藏状态 * 3,ReDisplay //再显示状态 * 4,Freeze //冻结状态 */ import { _decorator, BlockInputEvents, Node, Sprite, tween, v3, Vec3, Widget,Component } from "cc"; import { SysDefine, UIFromShowType, UIFromType } from "./Config/SysDefine"; import { UIMaskMgr } from "./Helps/UIMaskMgr"; import UIParse from "./UIParse"; import UIType from "./UIType"; import { PREVIEW } from "cc/env"; import { MainConfig } from "../../Launch/_MainConfig"; import { EGlobalEvent } from "../MesEvent/EGlobalEvent"; import GuideData from "../Mgr_Guide/GuideData"; import MesMgr from "../MesEvent/MesMgr"; import CocosUtils from "../ExCUtils/CocosUtils"; const { ccclass, property } = _decorator; const PropList:UIFromType[] = [UIFromType.PopUp,UIFromType.Tips]; const CheckOpen = (Type:UIFromType)=>{return PropList.includes(Type)} const bigScale = v3(1.2,1.2,1.2); const orgScale = v3(1,1,1); export type NodeAndCompType = Node |Component; @ccclass export default abstract class BaseUIForm extends UIParse { /**打开UI的时间戳 */ private _OpenTime:number = 0; /**获取UI存在的时间毫秒 */ get ExistTime(){ return Date.now() - this._OpenTime;} /**UI所在包 */ UIBundle: string; get tuuid(){ return this.node["_prefab"]["asset"]["uuid"]; } @property({ displayName: '是否屏蔽事件' }) mBlockInput:boolean = false; /**是否缓存 */ @property({displayName: '是否缓存' }) misCache: boolean = false; @property({type : UIType ,visible:false}) private _UIType: UIType = new UIType(); /*属性*/ //当前UI窗体类型 @property({type : UIType , displayName : '当前UI窗体类型'}) public get mUIType(): UIType { return this._UIType; } public set mUIType(value: UIType) { this._UIType = value; } @property({visible: function () { return this._UIType.FromsType == UIFromType.PopUp || this._UIType.FromsType == UIFromType.Tips } ,displayName:"窗口弹出动画"}) OpenAni:boolean = true; /**传入的参数 */ protected param:any = null; /**视图节点 */ protected _View:Node; protected _UIView:Node; protected _onCloseCheckUI:string[]=[]; protected onLoad(): void { this.UIBundle = CocosUtils.GetResBundle(this.tuuid).name; if (this.node.layer != SysDefine.SYS_GROUP) { ConsoleEx.Error("层级错误"); } PREVIEW && ConsoleEx.Log("UI路径:", CocosUtils.GetResBundlePath(this.tuuid), this.UIBundle) super.onLoad(); this._View = this.views.get("View"); this._UIView = this.views.get("UIView"); this.mBlockInput && this.setBlockInput(); (MainConfig.isMiniGame || PREVIEW) && this._miniGameAdapter(); this._PlayAnimation(); this._OpenTime = Date.now(); MesMgr.on(EGlobalEvent.E_UI_TIME_REFRESH,this.time_refresh,this); MesMgr.on(EGlobalEvent.E_UI_CLOSE_CALL_BACK,this.OtherCloseUI,this) } /**设置时间屏蔽 */ private setBlockInput(){ if(!this.node.getComponent(BlockInputEvents)){ this.node.addComponent(BlockInputEvents) } } /**播放进入动画 */ private _PlayAnimation() { const play = this.OpenAni && this._View && !GuideData.isGuide && CheckOpen(this.mUIType.FromsType) && this.mUIType.FromsShowType != UIFromShowType.HideOther if (play) { this._View.setScale(0, 0, 0); tween(this._View).to(0.2, { scale: bigScale }).to(0.1, { scale: orgScale }).call(() => { this._PopUpCallBack(); }).start(); } } /**进入动画播放完成 */ protected _PopUpCallBack() { } /**设置小游戏适配 */ private _miniGameAdapter() { let tWidget = this._View?.getComponent(Widget); if (tWidget) { tWidget.top = tWidget.top + 60; tWidget.updateAlignment(); } let tWidget2 = this._UIView?.getComponent(Widget); if (tWidget2) { tWidget2.top = tWidget2.top + 60; tWidget2.updateAlignment(); } } /** * 每天 每周 每月刷新时调用 * @param type * EveryDay * Week * Month */ protected time_refresh(type:string){ } private OtherCloseUI(uiname:string){ if(this._onCloseCheckUI.includes(uiname)){ this.onOtherCloseUI(); } } protected onOtherCloseUI(){ } /**传递参数 */ public onShow(m_param?: any) {this.param = m_param;} /// /// 显示状态 /// Display() { this.node.active = true; //设置模态窗体调用(必须是弹出窗体) if (this._UIType.FromsType == UIFromType.PopUp) { UIMaskMgr.Ins.SetMaskWindow(this.node, this._UIType.FormsLucenyType); } this.onDisplay(); } protected onDisplay(){}; /// /// 隐藏状态 /// Hideing() { this.node.active = false; //取消模态窗体调用 if (this._UIType.FromsType == UIFromType.PopUp) { UIMaskMgr.Ins.CancelMaskWindow(); } } /// /// 重新显示状态 /// ReDisplay() { this.node.active = true; //设置模态窗体调用(必须是弹出窗体) if (this._UIType.FromsType == UIFromType.PopUp) { UIMaskMgr.Ins.SetMaskWindow(this.node, this._UIType.FormsLucenyType); } } /// /// 冻结状态 /// Freeze() { this.node.active = true; } /**移动节点 */ MoveNodeList(list: NodeAndCompType[],Offset:Vec3,time:number = 0.2){ for (let i = 0; i < list.length; i++) { const target = list[i] let tNode: Node = target instanceof Component ? target.node : target; let Pos = tNode.position.clone(); tNode.setPosition(Pos.x + Offset.x, Pos.y + Offset.y, Pos.z); tween(tNode).to(time, { position: Pos },{ easing:"quadInOut", }).start(); } } protected onDestroy(): void { super.onDestroy(); } onClick_closeBtn(btn?:Node){ this.CloseUI(btn); } onClick_bgCloseBtn(btn?:Node){ this.CloseUI(btn); } onClick_btn_close(btn?:Node){ this.CloseUI(btn); } protected CloseUI(btn?:Node){ MesMgr.event(EGlobalEvent.E_CLOSE_UIFORMS,this); } /**清除Sprite引用 */ public ClearSpriteFrame(){ let list = this.node.getComponentsInChildren(Sprite); for (let i = 0; i < list.length; i++) { const tSprite = list[i]; if(tSprite["MY_ADD"] && tSprite.spriteFrame){ tSprite.spriteFrame.decRef(); tSprite.spriteFrame = null; } } } }