| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- 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();
- }
- }
|