import { Node, Label, Color, _decorator, tween, Vec3, Font, Prefab, instantiate, color, Layout } from 'cc'; import { NodeEx } from '../pool/NodeEx'; import { NodePool } from '../pool/NodePool'; import { resLoader } from '../res/ResLoader'; const { ccclass } = _decorator; @ccclass('TipsComp') class TipsComp extends NodeEx { } export class TipsManager { private _root: Node = null; //根节点 private _font: Font = null; //自定义字体 private _pool = new NodePool(); //池 private _label_name: string = "Label"; constructor(root: Node) { this._root = root; let tips_node = new Node("Tips").addComponent(TipsComp); let label_node = new Node(this._label_name).addComponent(Label); tips_node.node.addChild(label_node.node); this._pool.init(tips_node.node, 10, 120, false); } /** * 为提示加入自定义字体 自定义字体暂时不释放 * @param bundle 包名 * @param url 字体路径 * @param callback 加载成功回调 */ setFont(bundle: string, url: string, callback: Function = null) { resLoader.load(bundle, url, Font, (error: Error, res: Font) => { if (error) { console.error(error); } else { res.addRef(); this._font = res; callback && callback(); } }); } //提示模板不释放 setTipsNode(bundle: string, url: string, name: string, callback: Function = null) { resLoader.load(bundle, url, Prefab, (error: Error, res: Prefab) => { if (error) { console.error(error); } else { res.addRef(); this._pool.clear(); // (this._font) && this._font.decRef(); this._font = null; this._label_name = name; let tips_node = instantiate(res).addComponent(TipsComp); this._pool.init(tips_node.node, 10, 120, false); callback && callback(); } }); } /** * 提示 * @param str 提示文字 * @param size 字体大小 * @param c 字体颜色 */ setTips(str: string, size: number = 30, c: Color = new Color(255,255,255)) { let tips_node = this._pool.getNode(this._root); if (tips_node) { let label = tips_node.node.getChildByName(this._label_name).getComponent(Label); this._font && (label.font = this._font); tips_node.node.setPosition(0, 300); label.color = c; label.string = str; label.fontSize = size; label.updateRenderData(true); let layout = tips_node.getComponent(Layout); if (layout) { layout.type = Layout.Type.HORIZONTAL; layout.updateLayout(true); layout.type = Layout.Type.VERTICAL; layout.updateLayout(true); } tween(tips_node.node).delay(0.5).by(0.5, { position: new Vec3(0, 150, 0) }).call(() => { this._pool.putNode(tips_node); }).start(); } } }