RewardView.ts 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. import { _decorator, instantiate, Label, Node, Sprite, NodePool } from 'cc';
  2. import { UIView } from '@scripts/framework/ui/UIView';
  3. import { AppKernel } from '@scripts/app/AppKernel';
  4. import { UIViewID } from '@scripts/define/UIDefine';
  5. import { addBtnClick } from '@scripts/utils/UIHelper';
  6. import { setSpriteFrame } from '@scripts/utils/ResHelper';
  7. import { UIPopup } from '@scripts/framework/ui/UIPopup';
  8. const { ccclass, property } = _decorator;
  9. @ccclass('RewardView')
  10. export class RewardView extends UIPopup {
  11. readonly viewId = UIViewID.RewardView;
  12. @property(Node)
  13. private btn_receive: Node;
  14. @property(Node)
  15. private temp_item: Node;
  16. @property(Node)
  17. private rewards: Node;
  18. private _callback: Function;
  19. // 对象池
  20. private _itemPool: NodePool = new NodePool();
  21. // 当前正在使用的节点列表
  22. private _usedItems: Node[] = [];
  23. protected onBeforeOpen(param: any) {
  24. console.log('RewardView onBeforeOpen', param);
  25. const { reward, callback } = param;
  26. if (callback) this._callback = callback;
  27. this.updateView(reward);
  28. }
  29. protected onCreate(): void | Promise<void> {
  30. addBtnClick(this.btn_receive, this.onBtnReceiveClick, this);
  31. }
  32. private updateView(param: any) {
  33. for (const node of this._usedItems) {
  34. this._itemPool.put(node);
  35. }
  36. this._usedItems.length = 0;
  37. const needShowRewards = ["sc", "gc"];
  38. // 遍历奖励对象
  39. for (const [key, val] of Object.entries(param)) {
  40. if (!needShowRewards.includes(key)) continue;
  41. let itemNode: Node;
  42. if (this._itemPool.size() > 0) {
  43. itemNode = this._itemPool.get();
  44. } else {
  45. itemNode = instantiate(this.temp_item);
  46. }
  47. itemNode.active = true;
  48. itemNode.parent = this.rewards;
  49. // 填充UI
  50. const num = itemNode.getChildByName('num');
  51. num.getComponent(Label).string = `${(Number(val) / 100).toFixed(2)}`;
  52. const icon = itemNode.getChildByName('icon');
  53. const iconCmp = icon.getComponent(Sprite);
  54. setSpriteFrame(iconCmp, "textures/reward/" + key);
  55. this._usedItems.push(itemNode);
  56. }
  57. }
  58. private onBtnReceiveClick() {
  59. this._callback && this._callback();
  60. AppKernel.ui.close(UIViewID.RewardView);
  61. }
  62. protected async onClose(_reason) {
  63. for (const node of this._usedItems) {
  64. this._itemPool.put(node);
  65. }
  66. this._usedItems.length = 0;
  67. }
  68. // 弹窗彻底销毁,清空池子释放资源
  69. protected onDestroy() {
  70. this._itemPool.clear();
  71. super.onDestroy();
  72. }
  73. }