import { _decorator, Component, find, Node, EventHandler, SystemEventType, tween, Vec3, Quat, quat } from "cc"; import { UITween } from "../tween/UITween"; import { WindowSystem } from "./WindowSystem"; const { ccclass, property } = _decorator; /** * 窗口组件,必须赋予窗口顶级节点,定义关闭节点、窗口参数获取等 * @author 袁浩 */ @ccclass('Window') export class Window extends Component { @property({ tooltip: "可关闭窗口的节点列表,如果无数据,那么窗口系统也会自动找子节点中名称closeNode的节点当作关闭节点", type: [Node] }) public closeNodes: Node[] = []; @property({ tooltip: "窗口参数得到或者改变的回调,回调参数为彻底关闭方法", type: [EventHandler] }) public onParams: EventHandler[] = []; @property({ tooltip: "窗口关闭中的回调,注意,当设置了onClosing,回调参数会关闭本脚本的方法来手动关闭,如果不调用会导致无法关闭", type: [EventHandler] }) public onClosing: EventHandler[] = []; @property({ tooltip: "窗口关闭动画", type: UITween }) public closeTween: UITween; /** * 窗口相对于resources的路径 */ public prefabPath: string; /** * OpenWindow脚本的关闭回调配置 */ public openWindowOnClosing: EventHandler[] = []; private _params: any[] = []; public setParams(value: any[]) { this._params = value; this.isStarted && this.callParams(); } /** * openWindow.open传递的参数 */ public get params(): any { return this._params; } private isStarted: boolean = false; protected start() { this.checkCloseNode(); this.callParams(); this.isStarted = true; WindowSystem.onWindowOpen(this); } private callParams() { for (let i = 0; i < this.onParams.length; i++) { this.onParams[i].emit(this._params); } } protected checkCloseNode() { var closeNodes = this.closeNodes; var childCloseNode = this.node.getChildByName("closeNode"); childCloseNode && closeNodes.indexOf(childCloseNode) == -1 && (closeNodes.push(childCloseNode)); for (let i = 0; i < closeNodes.length; i++) { const closeNode = closeNodes[i]; closeNode.on(SystemEventType.TOUCH_END, () => { this.close(); }, this); } } protected onDestroy() { WindowSystem.onWindowClose(this); } /** * 关闭窗口 */ public close() { if (this.closeTween) { this.closeTween.target = this.node; let onOneRepeatComplete = new EventHandler(); onOneRepeatComplete.target = this.node; onOneRepeatComplete.component = "Window"; onOneRepeatComplete.handler = "forceClose"; this.closeTween.onOneRepeatComplete.push(onOneRepeatComplete); this.closeTween.play(); } else { WindowSystem.close(this); } } /** * 强制关闭窗口,无法获得onClosing时间 */ public forceClose() { this.node.destroy(); } }