/** * @file TalentItemComp.ts * @description 天赋图鉴项组件(UI 视图层) * * 职责: * 1. 接收 TalentsComp 下发的天赋卡配置(技能卡)。 * 2. 渲染名称、描述、图标和背景。 * 3. 背景颜色根据 wave 映射为对应的 poolLv。 * * 依赖: * - CardSet.CardConfig —— 单条卡牌配置 * - SkillSet —— 获取技能图标 */ import { _decorator, Label, Sprite, SpriteFrame } 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 { CardConfig } from "../common/config/CardSet"; import { FieldSkillSet, SkillSet } from "../common/config/SkillSet"; import { CardBgComp } from "./CardBgComp"; import { smc } from "../common/SingletonModuleComp"; import { oops } from "db://oops-framework/core/Oops"; const { ccclass, property } = _decorator; /** TalentItemComp —— 天赋图鉴项组件 */ @ccclass('TalentItemComp') @ecs.register('TalentItem', false) export class TalentItemComp extends CCComp { @property({ type: Label, tooltip: "天赋名称" }) lbl_name: Label = null!; @property({ type: Label, tooltip: "天赋说明" }) lbl_info: Label = null!; @property({ type: Sprite, tooltip: "天赋图标" }) icon: Sprite = null!; @property({ type: CardBgComp, tooltip: "卡牌背景组件" }) bg: CardBgComp = null!; /** * 刷新单条天赋展示 * @param config CardPoolList 中的天赋卡(技能卡)配置 */ public updateItem(config: CardConfig): void { if (!config) return; if (this.lbl_name) this.lbl_name.string = config.name ?? ""; if (this.lbl_info) this.lbl_info.string = config.info ?? ""; // 直接复用 CardSet 中已映射好的 pool_lv,保证与技能卡牌背景一致 // CardSet 通过 waveToPoolLv[wave] 由 SKILL_CARD_WAVES 索引推导(wave 1→1, 5→2, 8→3) if (this.bg) { this.bg.apply(config.pool_lv || 1); } // 设置图标:驻场卡(skill=undefined 但有 field)走 FieldSkillSet,否则走 SkillSet // 与 SCardComp 保持一致,避免驻场卡无 icon 显示 if (this.icon) { let iconId: string | undefined; if (!config.skill && config.field && config.field.length > 0) { // 驻场卡:用 FieldSkillSet[field[0]].icon const fieldUuid = config.field[0]; iconId = FieldSkillSet[fieldUuid]?.icon || `${fieldUuid}`; } else if (config.skill) { // 技能卡:用 SkillSet[skill].icon iconId = SkillSet[config.skill]?.icon; } if (iconId) { if (smc.uiconsAtlas) { const frame = smc.uiconsAtlas.getSpriteFrame(iconId); if (frame) this.icon.spriteFrame = frame; } else { const sf = oops.res.get("game/heros/cards/" + iconId, SpriteFrame) as SpriteFrame; if (sf) this.icon.spriteFrame = sf; } } } } /** ECS 组件移除时销毁节点(CCComp 抽象方法实现) */ reset() { this.node.destroy(); } }