TopBarController.ts 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. // TopBarController.ts
  2. import { _decorator, Component, Node, Button, Label, find } from 'cc';
  3. import { SaveDataManager } from '../LevelSystem/SaveDataManager';
  4. const { ccclass, property } = _decorator;
  5. @ccclass('TopBarController')
  6. export class TopBarController extends Component {
  7. /* 顶部资源 & 关卡 */
  8. @property(Node) moneyAddBtn: Node = null; // 绿色 +
  9. @property(Node) diamondAddBtn: Node = null; // 紫色 +
  10. @property(Node) moneyLabel: Node = null; // 金币数字
  11. @property(Node) diamondLabel: Node = null; // 钻石数字
  12. private sdm: SaveDataManager = null;
  13. onLoad() {
  14. this.sdm = SaveDataManager.getInstance();
  15. this.bindButtons();
  16. this.refreshAll();
  17. }
  18. /* 绑定按钮事件 */
  19. private bindButtons() {
  20. this.moneyAddBtn?.on(Button.EventType.CLICK, () => this.addCoins(100), this);
  21. this.diamondAddBtn?.on(Button.EventType.CLICK, () => this.addDiamonds(20), this);
  22. }
  23. /* ================= 业务逻辑 ================= */
  24. private addCoins(v: number) {
  25. this.sdm.addCoins(v, 'ad');
  26. this.refreshCurrency();
  27. }
  28. private addDiamonds(v: number) {
  29. this.sdm.addDiamonds(v, 'ad');
  30. this.refreshCurrency();
  31. }
  32. /* ================= 刷新 ================= */
  33. private refreshCurrency() {
  34. const mLbl = this.moneyLabel?.getComponent(Label) || this.moneyLabel as unknown as Label;
  35. if (mLbl) mLbl.string = this.format(this.sdm.getCoins());
  36. const dLbl = this.diamondLabel?.getComponent(Label) || this.diamondLabel as unknown as Label;
  37. if (dLbl) dLbl.string = this.format(this.sdm.getDiamonds());
  38. }
  39. private refreshAll() {
  40. this.refreshCurrency();
  41. }
  42. // 供外部调用的公共刷新接口
  43. public updateUI(): void {
  44. this.refreshAll();
  45. }
  46. // 供其他控制器调用的静态更新方法
  47. public static updateTopBarUI(): void {
  48. const topBarNode = find('Canvas/TopBar');
  49. const topBarController = topBarNode?.getComponent('TopBarController');
  50. if (topBarController && 'updateUI' in topBarController) {
  51. (topBarController as any).updateUI();
  52. }
  53. }
  54. /* =============== Util =============== */
  55. private format(n: number) {
  56. return n >= 1000000 ? (n / 1e6).toFixed(1) + 'M' : n >= 1000 ? (n / 1e3).toFixed(1) + 'K' : n.toString();
  57. }
  58. }