使用Python arcade模块实现敌人跟随玩家时触发AttributeError报错
问题诊断
报错AttributeError: 'SpriteList' object has no attribute 'center_y'由两处代码错误共同导致:
- 方法调用参数传递错误:你在
on_update函数中遍历敌人精灵列表时,给follow_sprite方法传入的第一个参数是整个敌人精灵列表self.enemy_list(属于SpriteList类型),但该方法的self参数预期接收单个Enemy精灵实例。SpriteList是精灵容器类型,本身没有center_y坐标属性,直接访问就会抛出属性不存在的错误。 - 敌人实例类型不匹配:你在
setup函数中生成敌人时,用Arcade内置的arcade.Sprite基类实例化对象,而非你自己定义的带follow_sprite方法的Enemy子类,就算参数传递正确,普通Sprite实例也无法调用你写的自定义跟随逻辑。
修复方案
按顺序修改两处代码即可解决问题:
- 修正敌人实例化逻辑
找到setup函数中循环生成敌人的代码行,将实例化的类替换为自定义Enemy类:# 原错误代码 # enemy = arcade.Sprite(":resources:images/animated_characters/zombie/zombie_idle.png", SPRITE_SCALING) # 修改后代码 enemy = Enemy(":resources:images/animated_characters/zombie/zombie_idle.png", SPRITE_SCALING) - 修正跟随方法的调用逻辑
找到on_update函数中遍历敌人调用跟随方法的代码块,改为对单个敌人实例直接调用方法:# 原错误代码 # for enemy in self.enemy_list: # Enemy.follow_sprite(self.enemy_list, self.player_sprite) # 修改后代码 for enemy in self.enemy_list: enemy.follow_sprite(self.player_sprite)
效果说明
修改完成后重新运行代码,每个敌人精灵会独立执行朝玩家移动的逻辑,不会再抛出属性错误,原有的射击、碰撞检测、计分逻辑不受影响。
内容的提问来源于stack exchange,提问作者riley
相关产品推荐
相关产品推荐

