TipsManager.ts 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. import { Node, Label, Color, _decorator, tween, Vec3, Font, Prefab, instantiate, color, Layout } from 'cc';
  2. import { NodeEx } from '../pool/NodeEx';
  3. import { NodePool } from '../pool/NodePool';
  4. import { resLoader } from '../res/ResLoader';
  5. const { ccclass } = _decorator;
  6. @ccclass('TipsComp')
  7. class TipsComp extends NodeEx { }
  8. export class TipsManager {
  9. private _root: Node = null; //根节点
  10. private _font: Font = null; //自定义字体
  11. private _pool = new NodePool(); //池
  12. private _label_name: string = "Label";
  13. constructor(root: Node) {
  14. this._root = root;
  15. let tips_node = new Node("Tips").addComponent(TipsComp);
  16. let label_node = new Node(this._label_name).addComponent(Label);
  17. tips_node.node.addChild(label_node.node);
  18. this._pool.init(tips_node.node, 10, 120, false);
  19. }
  20. /**
  21. * 为提示加入自定义字体 自定义字体暂时不释放
  22. * @param bundle 包名
  23. * @param url 字体路径
  24. * @param callback 加载成功回调
  25. */
  26. setFont(bundle: string, url: string, callback: Function = null) {
  27. resLoader.load(bundle, url, Font, (error: Error, res: Font) => {
  28. if (error) {
  29. console.error(error);
  30. } else {
  31. res.addRef();
  32. this._font = res;
  33. callback && callback();
  34. }
  35. });
  36. }
  37. //提示模板不释放
  38. setTipsNode(bundle: string, url: string, name: string, callback: Function = null) {
  39. resLoader.load(bundle, url, Prefab, (error: Error, res: Prefab) => {
  40. if (error) {
  41. console.error(error);
  42. } else {
  43. res.addRef();
  44. this._pool.clear();
  45. // (this._font) && this._font.decRef();
  46. this._font = null;
  47. this._label_name = name;
  48. let tips_node = instantiate(res).addComponent(TipsComp);
  49. this._pool.init(tips_node.node, 10, 120, false);
  50. callback && callback();
  51. }
  52. });
  53. }
  54. /**
  55. * 提示
  56. * @param str 提示文字
  57. * @param size 字体大小
  58. * @param c 字体颜色
  59. */
  60. setTips(str: string, size: number = 30, c: Color = new Color(255,255,255)) {
  61. let tips_node = this._pool.getNode(this._root);
  62. if (tips_node) {
  63. let label = tips_node.node.getChildByName(this._label_name).getComponent(Label);
  64. this._font && (label.font = this._font);
  65. tips_node.node.setPosition(0, 300);
  66. label.color = c;
  67. label.string = str;
  68. label.fontSize = size;
  69. label.updateRenderData(true);
  70. let layout = tips_node.getComponent(Layout);
  71. if (layout) {
  72. layout.type = Layout.Type.HORIZONTAL;
  73. layout.updateLayout(true);
  74. layout.type = Layout.Type.VERTICAL;
  75. layout.updateLayout(true);
  76. }
  77. tween(tips_node.node).delay(0.5).by(0.5, { position: new Vec3(0, 150, 0) }).call(() => {
  78. this._pool.putNode(tips_node);
  79. }).start();
  80. }
  81. }
  82. }