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 windowSystem: WindowSystem; private isStarted: boolean = false; protected start() { this.checkSystem(); this.checkCloseNode(); this.callParams(); this.isStarted = true; } private callParams() { this.onParams && this.onParams.emit(this._params); } private checkSystem() { var windowSystemNode = find("Canvas/WindowSystem"); var windowSystem: WindowSystem; if (!windowSystemNode) {//如果没有窗口系统节点则创建一个 var windowSystemNode = new Node("WindowSystem"); windowSystem = windowSystemNode.addComponent(WindowSystem); } else { windowSystem = windowSystemNode.getComponent(WindowSystem); } windowSystem.createBySystem = true; this.windowSystem = windowSystem || windowSystemNode.addComponent(WindowSystem);//如果没有窗口系统脚本则创建一个 if (!windowSystemNode.parent) { windowSystemNode.parent = find("Canvas"); } windowSystem.onWindowOpen(this); } 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() { this.windowSystem.isValid && this.windowSystem.onWindowClose(this); } /** * 关闭窗口 */ public close() { if (this.closeTween) { this.closeTween.target = this.node; this.closeTween.onOneRepeatComplete = new EventHandler(); this.closeTween.onOneRepeatComplete.target = this.node; this.closeTween.onOneRepeatComplete.component = "Window"; this.closeTween.onOneRepeatComplete.handler = "forceClose"; this.closeTween.play(); } else { this.windowSystem.close(this); } } /** * 强制关闭窗口,无法获得onClosing时间 */ public forceClose() { this.node.destroy(); } }