AutoBind.ts 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. import { Button, Camera, Component, dragonBones, EditBox, Graphics, Label, Mask, MotionStreak, Node, PageView, ProgressBar, RichText, ScrollView, Slider, sp, Sprite, TiledMap, TiledTile, Toggle, VideoPlayer, WebView } from "cc";
  2. import List from "../list/List";
  3. import { AnimEvent } from "./AnimEvent";
  4. import { RollingNumber } from "./RollingNumber";
  5. let SYS_STANDARD_Separator = '.';
  6. let SeparatorMap: { [key: string]: string } = {
  7. "Node": "cc.Node",
  8. "Label": "cc.Label",
  9. "Button": "cc.Button",
  10. "Sprite": "cc.Sprite",
  11. "RichText": "cc.RichText",
  12. "Mask": "cc.Mask",
  13. "MotionStreak": "cc.MotionStreak",
  14. "TiledMap": "cc.TiledMap",
  15. "TiledTile": "cc.TiledTile",
  16. "Skeleton": "sp.Skeleton",
  17. "Graphics": "cc.Graphics",
  18. "Animation": "cc.Animation",
  19. "WebView": "cc.WebView",
  20. "EditBox": "cc.EditBox",
  21. "ScrollView": "cc.ScrollView",
  22. "VideoPlayer": "cc.VideoPlayer",
  23. "ProgressBar": "cc.ProgressBar",
  24. "PageView": "cc.PageView",
  25. "Slider": "cc.Slider",
  26. "Toggle": "cc.Toggle",
  27. "DragonBon": "dragonBones.ArmatureDisplay",
  28. "List": "List",
  29. "AnimEvent": "AnimEvent",
  30. "Camera": "cc.Camera",
  31. "RollingNumber": "RollingNumber",
  32. };
  33. export class AutoBind extends Component {
  34. $collector: string;
  35. protected Node: { [name: string]: Node } = {};
  36. protected Label: { [name: string]: Label } = {};
  37. protected Button: { [name: string]: Button } = {};
  38. protected Sprite: { [name: string]: Sprite } = {};
  39. protected RichText: { [name: string]: RichText } = {};
  40. protected Mask: { [name: string]: Mask } = {};
  41. protected MotionStreak: { [name: string]: MotionStreak } = {};
  42. protected TiledMap: { [name: string]: TiledMap } = {};
  43. protected TiledTile: { [name: string]: TiledTile } = {};
  44. protected Skeleton: { [name: string]: sp.Skeleton } = {};
  45. protected Graphics: { [name: string]: Graphics } = {};
  46. protected Animation: { [name: string]: Animation } = {};
  47. protected WebView: { [name: string]: WebView } = {};
  48. protected EditBox: { [name: string]: EditBox } = {};
  49. protected VideoPlayer: { [name: string]: VideoPlayer } = {};
  50. protected ScrollView: { [name: string]: ScrollView } = {};
  51. protected ProgressBar: { [name: string]: ProgressBar } = {};
  52. protected Slider: { [name: string]: Slider } = {};
  53. protected DragonBon: { [name: string]: dragonBones.ArmatureDisplay } = {}
  54. protected Toggle: { [name: string]: Toggle } = {};
  55. protected PageView: { [name: string]: PageView } = {};
  56. protected List: { [name: string]: List } = {};
  57. protected AnimEvent: { [name: string]: AnimEvent } = {};
  58. protected Camera: { [name: string]: Camera } = {};
  59. protected RollingNumber: { [name: string]: RollingNumber } = {};
  60. __preload() {
  61. this.bindComponent(this);
  62. }
  63. // 绑定组件
  64. bindComponent(component: AutoBind) {
  65. this.bindNode(component.node, component);
  66. }
  67. // 绑定node
  68. bindNode(node: Node, component: AutoBind) {
  69. if (component.$collector === node.uuid) {
  70. console.warn(`重复绑定退出.${node.name}`)
  71. return;
  72. }
  73. component.$collector = node.uuid;
  74. this._bindSubNode(node, component);
  75. }
  76. // 绑定子节点
  77. private _bindSubNode(node: Node, component) {
  78. // 检测前缀是否符合绑定规范
  79. let name = node.name;
  80. if (this.checkNodePrefix(name)) {
  81. // 获得这个组件的类型 和 名称
  82. let names = this.getPrefixNames(name);
  83. if (names === null || names.length !== 2 || !SeparatorMap[names[0]]) {
  84. console.log(`${name} 命令不规范,请使用Label.xxx的格式!`);
  85. return;
  86. }
  87. // 未定义的类型
  88. if (!component[`${names[0]}`]) {
  89. console.log(`${name[0]} 没有在BaseUIForm中定义,并不会影响运行`);
  90. component[`${names[0]}`] = {};
  91. }
  92. if (component[`${names[0]}`][names[1]]) {
  93. console.log(`${name} 已经被绑定了,请检查您是否出现了重名的情况!`);
  94. }
  95. if (SeparatorMap[names[0]] === 'cc.Node') {
  96. component[`${names[0]}`][names[1]] = node;
  97. } else {
  98. component[`${names[0]}`][names[1]] = node.getComponent(SeparatorMap[names[0]]);
  99. }
  100. }
  101. //绑定子节点
  102. node.children.forEach((target: Node) => {
  103. this._bindSubNode(target, component);
  104. });
  105. }
  106. //寻找子节点
  107. FindChildInNode(nodeName: string, rootNode: Node): Node {
  108. if (rootNode.name == nodeName) {
  109. return rootNode;
  110. }
  111. for (let i = 0; i < rootNode.children.length; i++) {
  112. let node = this.FindChildInNode(nodeName, rootNode.children[i]);
  113. if (node) {
  114. return node;
  115. }
  116. }
  117. return null;
  118. }
  119. //检测前缀是否符合绑定规范
  120. checkNodePrefix(name: string) {
  121. if (name.indexOf(SYS_STANDARD_Separator) == -1) {
  122. return false;
  123. }
  124. return true;
  125. }
  126. //获得类型和Name
  127. getPrefixNames(name: string) {
  128. if (name === null) {
  129. return;
  130. }
  131. return name.split(SYS_STANDARD_Separator);
  132. }
  133. private _getComponentName(component: Component) {
  134. return component.name.match(/<.*>$/)[0].slice(1, -1);
  135. }
  136. }