Files
pixelheros/assets/script/game/common/CardIconHelper.ts
panFD 450a8b81e5 refactor(field): 重构驻场光环数据结构,分离元数据与数值
1.  新增FieldEntry类型,将驻场词条的uuid与生效数值分离
2.  重构FieldSkillSet,移除各档位重复配置,仅保留基础元数据
3.  更新所有使用驻场词条的业务代码,适配新的数据结构
4.  修复数值渲染逻辑,使用词条携带的实际数值而非配置固化值
2026-08-11 22:36:28 +08:00

60 lines
2.1 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* @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].uuid;
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;
}
}