/** * @file CardIconHelper.ts * @description 卡牌图标解析与设置共享工具 * * 职责: * 统一处理技能卡/装备卡/商品卡的图标 ID 解析与 SpriteFrame 设置, * 避免 SkillBoxComp / SCardComp / ItemListComp / EquipListComp 重复维护相同逻辑。 * * 解析优先级: * 1. cardData.icon(卡牌自定义图标,最高优先级) * 2. 装备卡(trigger_type=Field 且有 field):取第一个 field 词条的 FieldSkillSet.icon * 3. 技能卡(有 skill):取 SkillSet.icon * 4. 兜底:skill uuid 或 card uuid 的字符串形式 */ import { Node, Sprite } from "cc"; import { CardConfig, CardTriggerType } from "./config/CardSet"; import { FieldSkillSet, SkillSet } from "./config/SkillSet"; import { smc } from "./SingletonModuleComp"; /** * 解析卡牌图标 ID * @param cardData 卡牌配置 * @returns 图标 ID(对应图集 frame 名),空字符串表示无法解析 */ export function getCardIconId(cardData: CardConfig | null): string { if (!cardData) return ""; // 1. 卡牌自定义 icon 优先 if (cardData.icon) return cardData.icon; // 2. 装备卡:取第一个 field 词条图标 if (cardData.field && cardData.field.length > 0) { const fieldUuid = cardData.field[0]; return FieldSkillSet[fieldUuid]?.icon || `${fieldUuid}`; } // 3. 技能卡:取 SkillSet.icon if (cardData.skill) { return SkillSet[cardData.skill]?.icon || `${cardData.skill}`; } // 4. 兜底:uuid 字符串 return `${cardData.uuid}`; } /** * 设置节点 Sprite 的图标 * @param node 目标节点(自动查找自身或子节点的 Sprite) * @param iconId 图标 ID(对应 smc.uiconsAtlas 中的 frame 名) */ export function setSpriteFrame(node: Node, iconId: string): void { if (!node || !iconId) return; const sprite = node.getComponent(Sprite) || node.getComponentInChildren(Sprite); if (!sprite) return; if (smc.uiconsAtlas) { const frame = smc.uiconsAtlas.getSpriteFrame(iconId); sprite.spriteFrame = frame || null; } }