import { _decorator, instantiate, Label, Node, Sprite, NodePool } from 'cc'; import { UIView } from '@scripts/framework/ui/UIView'; import { AppKernel } from '@scripts/app/AppKernel'; import { UIViewID } from '@scripts/define/UIDefine'; import { addBtnClick } from '@scripts/utils/UIHelper'; import { setSpriteFrame } from '@scripts/utils/ResHelper'; const { ccclass, property } = _decorator; @ccclass('RewardView') export class RewardView extends UIView { readonly viewId = UIViewID.RewardView; @property(Node) private btn_receive: Node; @property(Node) private temp_item: Node; @property(Node) private rewards: Node; private _callback: Function; // 对象池 private _itemPool: NodePool = new NodePool(); // 当前正在使用的节点列表 private _usedItems: Node[] = []; protected onBeforeOpen(param: any) { console.log('RewardView onBeforeOpen', param); const { reward, callback } = param; if (callback) this._callback = callback; this.updateView(reward); } protected onCreate(): void | Promise { addBtnClick(this.btn_receive, this.onBtnReceiveClick, this); } private updateView(param: any) { for (const node of this._usedItems) { this._itemPool.put(node); } this._usedItems.length = 0; // 遍历奖励对象 for (const [key, val] of Object.entries(param)) { let itemNode: Node; if (this._itemPool.size() > 0) { itemNode = this._itemPool.get(); } else { itemNode = instantiate(this.temp_item); } itemNode.active = true; itemNode.parent = this.rewards; // 填充UI const num = itemNode.getChildByName('num'); num.getComponent(Label).string = `${(Number(val) / 100).toFixed(2)}`; const icon = itemNode.getChildByName('icon'); const iconCmp = icon.getComponent(Sprite); setSpriteFrame(iconCmp, "textures/reward/" + key); this._usedItems.push(itemNode); } } private onBtnReceiveClick() { this._callback && this._callback(); AppKernel.ui.close(UIViewID.RewardView); } protected async onClose(_reason) { for (const node of this._usedItems) { this._itemPool.put(node); } this._usedItems.length = 0; } // 弹窗彻底销毁,清空池子释放资源 protected onDestroy() { this._itemPool.clear(); super.onDestroy(); } }