RewardView.ts 2.3 KB

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