Window.ts 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. import { _decorator, Component, find, Node, EventHandler, SystemEventType, tween, Vec3, Quat, quat } from "cc";
  2. import { UITween } from "../tween/UITween";
  3. import { WindowSystem } from "./WindowSystem";
  4. const { ccclass, property } = _decorator;
  5. /**
  6. * 窗口组件,必须赋予窗口顶级节点,定义关闭节点、窗口参数获取等
  7. * @author 袁浩
  8. */
  9. @ccclass('Window')
  10. export class Window extends Component {
  11. @property({ tooltip: "可关闭窗口的节点列表,如果无数据,那么窗口系统也会自动找子节点中名称closeNode的节点当作关闭节点", type: [Node] })
  12. public closeNodes: Node[] = [];
  13. @property({ tooltip: "窗口参数得到或者改变的回调,回调参数为彻底关闭方法", type: EventHandler })
  14. public onParams: EventHandler;
  15. @property({ tooltip: "窗口关闭中的回调,注意,当设置了onClosing,回调参数会关闭本脚本的方法来手动关闭,如果不调用会导致无法关闭", type: EventHandler })
  16. public onClosing: EventHandler;
  17. @property({ tooltip: "窗口关闭动画", type: UITween })
  18. public closeTween: UITween;
  19. /**
  20. * 窗口相对于resources的路径
  21. */
  22. public prefabPath: string;
  23. /**
  24. * OpenWindow脚本的关闭回调配置
  25. */
  26. public openWindowOnClosing: EventHandler;
  27. private _params: any = [];
  28. public setParams(value: any[]) {
  29. this._params = value;
  30. this.isStarted && this.callParams();
  31. }
  32. /**
  33. * openWindow.open传递的参数
  34. */
  35. public get params(): any {
  36. return this._params;
  37. }
  38. private windowSystem: WindowSystem;
  39. private isStarted: boolean = false;
  40. protected start() {
  41. this.checkSystem();
  42. this.checkCloseNode();
  43. this.callParams();
  44. this.isStarted = true;
  45. }
  46. private callParams() {
  47. this.onParams && this.onParams.emit(this._params);
  48. }
  49. private checkSystem() {
  50. var windowSystemNode = find("Canvas/WindowSystem");
  51. var windowSystem: WindowSystem;
  52. if (!windowSystemNode) {//如果没有窗口系统节点则创建一个
  53. var windowSystemNode = new Node("WindowSystem");
  54. windowSystem = windowSystemNode.addComponent(WindowSystem);
  55. }
  56. else {
  57. windowSystem = windowSystemNode.getComponent(WindowSystem);
  58. }
  59. windowSystem.createBySystem = true;
  60. this.windowSystem = windowSystem || windowSystemNode.addComponent(WindowSystem);//如果没有窗口系统脚本则创建一个
  61. if (!windowSystemNode.parent) {
  62. windowSystemNode.parent = find("Canvas");
  63. }
  64. windowSystem.onWindowOpen(this);
  65. }
  66. protected checkCloseNode() {
  67. var closeNodes = this.closeNodes;
  68. var childCloseNode = this.node.getChildByName("closeNode");
  69. childCloseNode && closeNodes.indexOf(childCloseNode) == -1 && (closeNodes.push(childCloseNode));
  70. for (let i = 0; i < closeNodes.length; i++) {
  71. const closeNode = closeNodes[i];
  72. closeNode.on(SystemEventType.TOUCH_END, () => {
  73. this.close();
  74. }, this);
  75. }
  76. }
  77. protected onDestroy() {
  78. this.windowSystem.isValid && this.windowSystem.onWindowClose(this);
  79. }
  80. /**
  81. * 关闭窗口
  82. */
  83. public close() {
  84. if (this.closeTween) {
  85. this.closeTween.target = this.node;
  86. this.closeTween.onOneRepeatComplete = new EventHandler();
  87. this.closeTween.onOneRepeatComplete.target = this.node;
  88. this.closeTween.onOneRepeatComplete.component = "Window";
  89. this.closeTween.onOneRepeatComplete.handler = "forceClose";
  90. this.closeTween.play();
  91. }
  92. else {
  93. this.windowSystem.close(this);
  94. }
  95. }
  96. /**
  97. * 强制关闭窗口,无法获得onClosing时间
  98. */
  99. public forceClose() {
  100. this.node.destroy();
  101. }
  102. }