import { Label, Prefab, instantiate, Node, math } from "cc"; import { Layout_UI_Notify } from "./Layout_UI_Notify"; import { GameUILayers, gui, ui_base } from "../../core/ui/ui"; import { ModuleDef } from "../../Scripts/ModuleDef"; class NotifyInfo { private static readonly time: number = 2; private static readonly init_y: number = 120; private static readonly up_y: number = 80;//上升一格 private static readonly move_speed: number = 880;//向上移动速度 private static readonly sc_state0: number = 0.8;//变小大小 private static readonly sc_state0_time: number = 0.22; private static readonly sc_state1: number = 1.2;//变大大小 private static readonly sc_state1_time: number = 0.41; private static readonly sc_state2: number = 1;//正常大小 private time: number; private node: Node; private state: number; private _state_time: number = 0; public constructor(node: Node, parent: Node, txt: string) { this.time = NotifyInfo.time; this.node = node; this.state = 0; this._state_time = 0; let label = node.getComponentInChildren(Label); label.string = txt; node.parent = parent; node.setPosition(0, NotifyInfo.init_y, 0); node.setScale(NotifyInfo.sc_state0, NotifyInfo.sc_state0, NotifyInfo.sc_state0); node.active = true; } public up(): void { // this.node.setPosition(this.node.position.x, this.node.position.y + NotifyInfo.up_y, this.node.position.z); } public run(dt: number): boolean { this.time -= dt; if (this.time <= 0) { this.node.destroy(); this.node = null; return true; } else if (this.time < 0.5) { // this.node.setPosition(this.node.position.x, this.node.position.y + NotifyInfo.move_speed * dt, this.node.position.z); } else { if (this.state === 0) { this._state_time += dt; let ratio = this._state_time / NotifyInfo.sc_state0_time; if (ratio >= 1) { this.state = 1; this._state_time = 0; this.node.setScale(NotifyInfo.sc_state1, NotifyInfo.sc_state1, NotifyInfo.sc_state1); } else { let sc = math.lerp(NotifyInfo.sc_state0, NotifyInfo.sc_state1, ratio); this.node.setScale(sc, sc, sc); } } else if (this.state === 1) { this._state_time += dt; let ratio = this._state_time / NotifyInfo.sc_state1_time; if (ratio >= 1) { this.state = 2; this._state_time = 0; this.node.setScale(NotifyInfo.sc_state2, NotifyInfo.sc_state2, NotifyInfo.sc_state2); } else { let sc = math.lerp(NotifyInfo.sc_state1, NotifyInfo.sc_state2, ratio); this.node.setScale(sc, sc, sc); } } } return false; } } export class UINotify extends ui_base { constructor() { super(ModuleDef.BASIC, 'ui_notify/UI_Notify', GameUILayers.NOTICE, Layout_UI_Notify); } static async show(msg: string) { let ui = gui.get(UINotify); if (!ui) ui = await gui.show(UINotify); ui.newNotify(msg); } private _info_prefab: Prefab; private notifys: NotifyInfo[] = []; protected onCreated(): void { let layout = this.getLayout(); this._info_prefab = layout.info_prefab; } public newNotify(txt: string) { let info = new NotifyInfo(instantiate(this._info_prefab), this.node, txt); for (var i = this.notifys.length - 1; i >= 0; i--)this.notifys[i].up(); this.notifys.push(info); } protected onUpdate(dt?: number): void { for (var i = this.notifys.length - 1; i >= 0; i--)if (this.notifys[i].run(dt)) this.notifys.splice(i, 1); } dispose(): void { this._info_prefab = null; } }