class_name IconTextureProvider extends RefCounted # 物品/房屋图标资源缓存。 # # 原 Egret 图标分散在 item_icon、icon、petIcon、plant、house 多个目录。 # 这里统一按优先级查找并缓存 Texture2D,避免 UI 面板和 GameScene 重复 load。 const ITEM_ICON_PATHS := [ "res://assets/egret/item_icon/%s.png", "res://assets/egret/assets/icon/icon/%s.png", "res://assets/egret/assets/icon/petIcon/%s.png", "res://assets/egret/assets/icon/plant/%s.png", ] const ITEM_FALLBACK_PATH := "res://assets/egret/item_icon/1010.png" const HOUSE_PATH := "res://assets/egret/assets/icon/house/%s.png" const HOUSE_FALLBACK_PATH := "res://assets/egret/assets/icon/house/1.png" var _cache: Dictionary = {} func item_icon(icon_id: int) -> Texture2D: var key := "item:%s" % icon_id if _cache.has(key): return _cache[key] var texture := _load_first_existing(_item_icon_candidates(icon_id), ITEM_FALLBACK_PATH) _cache[key] = texture return texture func house(level: int, max_level := 12) -> Texture2D: var farm_level := clampi(level, 1, max_level) var key := "house:%s" % farm_level if _cache.has(key): return _cache[key] var texture := _load_first_existing([HOUSE_PATH % farm_level], HOUSE_FALLBACK_PATH) _cache[key] = texture return texture func clear() -> void: _cache.clear() func _item_icon_candidates(icon_id: int) -> Array[String]: var paths: Array[String] = [] for template in ITEM_ICON_PATHS: paths.append(template % icon_id) return paths func _load_first_existing(paths: Array[String], fallback_path: String) -> Texture2D: for path in paths: if ResourceLoader.exists(path): return load(path) as Texture2D if ResourceLoader.exists(fallback_path): return load(fallback_path) as Texture2D return null