import { _decorator, Node, Label, PrefabLink, instantiate, Prefab, SpriteAtlas, Sprite, resources } from "cc"; import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS"; import { CCComp } from "../../../../extensions/oops-plugin-framework/assets/module/common/CCComp"; import { oops } from "../../../../extensions/oops-plugin-framework/assets/core/Oops"; import { GameEvent } from "../common/config/GameEvent"; import { smc } from "../common/SingletonModuleComp"; const { ccclass, property } = _decorator; /** 视图层对象 */ @ccclass('MissionGetsCompComp') @ecs.register('MissionGetsComp', false) export class MissionGetsCompComp extends CCComp { get_datas: { [key: number]: { num: number, node: Node, type?: number } } = {}; get_nodes: Node[] = []; // 图标图集缓存 private uiconsAtlas: SpriteAtlas | null = null; onLoad() { oops.message.on(GameEvent.UpdateMissionGet, this.onUpdateMissionGet, this); oops.message.on(GameEvent.MissionStart, this.onMissionStart, this); } start() { } onDestroy() { oops.message.off(GameEvent.UpdateMissionGet, this.onUpdateMissionGet, this); oops.message.off(GameEvent.MissionStart, this.onMissionStart, this); } onMissionStart(){ // 清理旧的节点 this.get_nodes.forEach(node => { if (node && node.isValid) { node.destroy(); } }); this.get_nodes = []; this.get_datas = {}; } private onUpdateMissionGet(event: string, args: any) { if (!args || !args.uuid) return; const { uuid, icon, type } = args; this.addGet(uuid, icon, type); } addGet(uuid: number, iconName?: string, type?: number) { if (this.get_datas[uuid]) { this.get_datas[uuid].num++; this.updateNodeNum(this.get_datas[uuid].node, this.get_datas[uuid].num); } else { this.load_hui(uuid, iconName || uuid.toString(), type); } } load_hui(uuid: number, iconName: string, type?: number){ var path = "game/gui/get"; var prefab: Prefab = oops.res.get(path, Prefab)!; if (!prefab) { console.warn("Prefab not found:", path); return; } var node = instantiate(prefab); // 将节点添加到父节点下 this.node.addChild(node); // 记录数据 this.get_datas[uuid] = { num: 1, node: node, type: type }; this.get_nodes.push(node); node.getChildByName("num").getComponent(Label).string = "1"; const sprite = node.getChildByName("icon").getComponent(Sprite); if (!sprite) return; if (this.uiconsAtlas) { const frame = this.uiconsAtlas.getSpriteFrame(iconName); if (frame) { sprite.spriteFrame = frame; } } else { // 加载图集 resources.load("gui/uicons", SpriteAtlas, (err, atlas) => { if (err) { console.error("[MissionGetsComp] Failed to load uicons atlas", err); return; } this.uiconsAtlas = atlas; const frame = atlas.getSpriteFrame(iconName); if (frame) { sprite.spriteFrame = frame; } }); } } private updateNodeNum(node: Node, num: number) { const label = node.getChildByName("num")?.getComponent(Label); if (label) { label.string = num.toString(); } } /** 视图对象通过 ecs.Entity.remove(ModuleViewComp) 删除组件是触发组件处理自定义释放逻辑 */ reset() { this.node.destroy(); } }