如何用for循环批量缩放Pygame中的多张图像?
问题原因与解决方案
你的循环写法之所以不生效,核心原因是:循环变量i只是临时保存了self.quieto、self.andando的引用,当你执行i = pygame.transform.scale(...)时,只是把i指向了新生成的缩放后图像对象,但并没有更新self对应的属性引用。原来的self.quieto和self.andando仍然指向未缩放的原始图像,自然看不到效果。
以下是两种简洁的解决方式,适合后续扩展更多状态:
方式1:遍历属性名称,动态修改self的属性
直接通过属性名来获取和设置self的属性,这样能直接更新目标属性的引用:
def __init__(self): pygame.sprite.Sprite.__init__(self) self.image = pygame.image.load("Migue/m_normal.png") # 先加载原始图像 self.quieto = pygame.image.load("Migue/m_normal.png") self.andando = pygame.image.load("Migue/m_andando_normal.png") self.image = pygame.transform.scale(self.image, sizenorm) # 定义需要缩放的状态属性名称列表 state_attrs = ["quieto", "andando"] for attr_name in state_attrs: # 获取当前属性的原始图像 original_img = getattr(self, attr_name) # 缩放后重新赋值给对应的属性 setattr(self, attr_name, pygame.transform.scale(original_img, sizenorm))
后续新增状态时,只需要在state_attrs列表里添加新的属性名即可。
方式2:用字典统一管理状态图像
把所有状态图像放到一个字典里,后续维护和遍历都更方便:
def __init__(self): pygame.sprite.Sprite.__init__(self) self.image = pygame.image.load("Migue/m_normal.png") self.image = pygame.transform.scale(self.image, sizenorm) # 用字典存储所有状态图像 self.states = { "quieto": pygame.image.load("Migue/m_normal.png"), "andando": pygame.image.load("Migue/m_andando_normal.png") # 后续新增状态直接在这里加键值对 } # 遍历字典缩放所有图像 for state_name in self.states: self.states[state_name] = pygame.transform.scale(self.states[state_name], sizenorm)
使用时直接通过self.states["quieto"]来调用对应状态的图像即可。
内容的提问来源于stack exchange,提问作者Fire Frekox
相关产品推荐
相关产品推荐

