import { AppKernel } from "@scripts/app/AppKernel"; import { AssetSlot } from "@scripts/components/AssetSlot"; import { BUNDLE_ID } from "@scripts/define/ResDefine"; import { isValid, Sprite, SpriteFrame } from "cc"; import { ImgFitMode, setSpriteFitMode } from "./UIHelper"; const GoodsIconRes = "common/goodsIcon/img_icon"; interface ISetSpriteOptions { bundle?: string; fitMode?: ImgFitMode; onCheck?: () => boolean; } /** * 动态加载spriteFrame path和bundle都是空 则为sprite.spriteFrame = null; * @param sprite * @param path * @param bundle * @returns */ export async function setSpriteFrame(sprite: Sprite, path?: string, optins?: ISetSpriteOptions) { const node = sprite.node; const bundle = optins?.bundle; const fitMode = optins?.fitMode; const onCheck = optins?.onCheck; const slot = node.getComponent(AssetSlot) || node.addComponent(AssetSlot); if (!path && !bundle) { slot.changeAsset(null); sprite.spriteFrame = null; return; } let res: SpriteFrame = null; const resources = AppKernel.resources; if (path.startsWith("http")) { res = await resources.loadRemoteSp(path); } else { if (!path.endsWith("/spriteFrame")) path += "/spriteFrame"; res = await resources.load(bundle || BUNDLE_ID.Lobby, path, SpriteFrame); } if (!res) return; if (!isValid(sprite)) { resources.releaseRes(res); return; } if (onCheck && !onCheck()) return; res.addRef(); sprite.spriteFrame = res; setSpriteFitMode(sprite, fitMode); slot.changeAsset(res); return res; } export async function setGoodsIcon(sprite: Sprite, type: number, isGCOnly = false) { const iconPath = isGCOnly ? `${GoodsIconRes}gc` : `${GoodsIconRes}${type}`; return setSpriteFrame(sprite, `${iconPath}`); }