如何根据Unit的Action状态动态设置UnitAnimations的image属性
解决方法:根据状态动态访问对象属性
核心思路
Python的getattr()函数支持通过字符串形式的属性名,动态获取对象的属性值。结合Action枚举的name属性(对应idle/attack字符串),就能直接拿到UnitAnimations中对应的动画列表,再取指定帧赋值给image即可。
方法1:直接在Unit.update()中实现
修改Unit类的update方法,用getattr动态获取对应动画列表:
from enum import IntEnum class Action(IntEnum): idle = 0 attack = 1 class UnitAnimations: def __init__(self, idle_list, attack_list): self.idle = idle_list self.attack = attack_list self.image = idle_list[0] # 示例动画列表,实际替换为你的资源 idle_list = ["idle_frame_0", "idle_frame_1"] attack_list = ["attack_frame_0", "attack_frame_1", "attack_frame_2"] class Unit: def __init__(self, name): self.name = name self.action = Action.idle self.animations = UnitAnimations(idle_list, attack_list) def update(self): frame_index = 0 # 动态获取当前动作对应的动画列表 current_anim_list = getattr(self.animations, self.action.name) # 设置当前帧的image self.animations.image = current_anim_list[frame_index]
方法2:封装到UnitAnimations类中(更优雅)
把动态设置image的逻辑封装到UnitAnimations内部,让职责划分更清晰:
from enum import IntEnum class Action(IntEnum): idle = 0 attack = 1 class UnitAnimations: def __init__(self, idle_list, attack_list): self.idle = idle_list self.attack = attack_list self.image = idle_list[0] def set_image_by_action(self, action, frame_index): # 动态获取对应动作的动画列表 anim_list = getattr(self, action.name) # 可选:添加索引越界判断,避免报错 if 0 <= frame_index < len(anim_list): self.image = anim_list[frame_index] else: # 索引无效时默认取第一帧,也可根据需求抛出异常 self.image = anim_list[0] idle_list = ["idle_frame_0", "idle_frame_1"] attack_list = ["attack_frame_0", "attack_frame_1", "attack_frame_2"] class Unit: def __init__(self, name): self.name = name self.action = Action.idle self.animations = UnitAnimations(idle_list, attack_list) def update(self): frame_index = 0 # 调用封装好的方法设置image self.animations.set_image_by_action(self.action, frame_index)
补充说明
Action作为IntEnum,每个枚举成员的name属性会返回对应的字符串(比如Action.idle.name返回"idle"),刚好和UnitAnimations中的属性名匹配,完美适配动态获取的需求。- 如果后续新增动作(比如
move),只需在Action中添加枚举项,同时给UnitAnimations添加对应的列表属性即可,无需修改动态获取的逻辑,扩展性强。
内容的提问来源于stack exchange,提问作者user14534957
相关产品推荐
相关产品推荐

