import uiHelper from "./UIHelper"; import { SysDefine } from "../config/SysDefine"; import UIBinder from "./UIBinder"; /* * @Author: 邓朗 基于论坛中的uikiller * @Date: 2019-09-19 14:28:09 * @Last Modified by: 邓朗 * @Last Modified time: 2019-10-07 16:36:20 * * 在用脚本控制UI的时候, 绑定UI是一件很烦人的事情, 尤其是将UI拖到面板上绑定, 就更加繁琐, * 或者在onload, start上 使用getChildByName() 或者cc.find() 查找结点, 又会显得代码冗长 * 大部分时候, 在我创建这个结点的时候, 我就已经想好要让这个结点完成什么功能了(针对渲染结点), 所有我希望在取名字的 * 时候,通过特殊的命名规则, 就可以在脚本中直接使用此结点, Binder就来完成此功能 */ class Binder { // 绑定组件 public bindComponent(component: UIBinder) { this.bindNode(component.node, component); } // 绑定node public bindNode(node: cc.Node, component: UIBinder) { if (component.$collector === node.uuid) { // cc.warn(`重复绑定退出.${node.name}`) return; } component.$collector = node.uuid; this._bindSubNode(node, component); } // 绑定子节点 private _bindSubNode(node: cc.Node, component: UIBinder) { // 检测前缀是否符合绑定规范 let name = node.name; if(uiHelper.checkBindChildren(name)) { if (uiHelper.checkNodePrefix(name)) { // 获得这个组件的类型 和 名称 let names = uiHelper.getPrefixNames(name); if(names === null || names.length !== 2 || !SysDefine.SeparatorMap[names[0]]) { console.log(names); cc.log(`${name} 命令不规范, 请使用_lab$xxx的格式!, 或者是在SysDefine中没有定义`); return ; } // 未定义的类型 if(!component[`${names[0]}s`]) { cc.log(`${name[0]}s没有在BaseUIPanel中定义, 并不会影响运行`); component[`${names[0]}s`] = {}; } if(component[`${names[0]}s`][names[1]]) { cc.log(`${name} 已经被绑定了, 请检查您是否出现了重名的情况!`); } if(SysDefine.SeparatorMap[names[0]] === 'cc.Node') { component[`${names[0]}s`][names[1]] = node; }else { component[`${names[0]}s`][names[1]] = node.getComponent(SysDefine.SeparatorMap[names[0]]); } } // 绑定子节点 node.children.forEach((target: cc.Node) => { this._bindSubNode(target, component); }); } } } export default new Binder();