Pygame开发中实例化Player类后追加属性及参数缺失报错解决
错误原因
- Player类的
__init__方法中idle是必填位置参数,你实例化Player时只传入了4个参数,缺少必填的idle参数,所以首先触发参数缺失报错。 - 即使给
idle设置默认值,原__init__方法中直接执行了self.image = self.idle[0],如果实例化时idle为占位空值,访问索引[0]也会触发类型错误。
修复方案
步骤1:修改Player类逻辑,支持延后设置动画属性
将动画相关参数设为可选,同时增加专门的动画设置方法统一处理属性初始化,避免漏赋值self.image:
class Player(pygame.sprite.Sprite): def __init__(self, name, position, axsis, movment, idle=None, walk = None, jump = None): pygame.sprite.Sprite.__init__(self) self.name = name self.idle = idle self.walk = walk self.jump = jump # 仅当idle不为空时初始化image,否则延后到设置动画时处理 if self.idle is not None: self.image = self.idle[0] self.movment = movment self.left, self.right = axsis self.pos = vec(position[0],position[1]) # 新增动画设置方法,统一处理属性赋值和image初始化 def set_animation(self, idle=None, walk=None, jump=None): if idle is not None: self.idle = idle self.image = self.idle[0] if walk is not None: self.walk = walk if jump is not None: self.jump = jump
步骤2:修改Game类逻辑,补全代码笔误和资源加载逻辑
你原代码存在方法名不匹配、方法调用缺括号、路径赋值不符合预期等问题,修改后示例如下:
class Game(): def __init__(self,json_file): self.player_attribute = json_file # 提前加载动画帧资源,注意idle是帧列表,需要用[]包裹,路径用正斜杠避免转义问题 self.ghost_idle = [pygame.image.load("images/ghost.png").convert_alpha()] def character(self): self.npc = [] for i in self.player_attribute: # 现在idle是可选参数,实例化时可以不传 self.npc.append(Player(i['name'], i['position'], i['axsis'], i['movment'])) self.add_animation() return self.npc def add_animation(self): for i in self.npc: # 调用封装好的方法设置动画,无需手动逐个赋值属性 i.set_animation(idle=self.ghost_idle) def main_loop(self): self.character()
可选简化方案
如果你不想新增set_animation方法,直接在外部给实例赋值属性也可以,需要注意赋值idle后手动补全image属性:
def add_animation(self): for i in self.npc: i.idle = [pygame.image.load("images/ghost.png").convert_alpha()] # 必须手动给image赋值,实例化时idle为空,没有执行过这行逻辑 i.image = i.idle[0]
内容的提问来源于stack exchange,提问作者Django
相关产品推荐
相关产品推荐

