Pygame跨类访问精灵位置报GroupSingle无rect属性错误
问题原因
你定义的player是pygame.sprite.GroupSingle()生成的单精灵组容器,不是Player类的精灵实例本身。精灵组作为容器没有rect属性,直接调用player.rect自然会报属性不存在的错误。
修复方案
- 方案1:通过GroupSingle的内置属性取到实际精灵
GroupSingle提供了.sprite属性用来访问它内部存储的唯一精灵对象,把你Obstacle类里的打印代码替换成下面的内容即可:# 原来的错误写法 print(player.rect.x) print(player.sprite.rect.x) - 方案2:单独保存Player实例的引用
初始化玩家的时候单独存一份精灵实例的变量,后续访问不需要从组里提取,代码可读性更高:
之后在需要访问玩家位置的地方直接调用# 原来的初始化代码 # player = pygame.sprite.GroupSingle() # player.add(Player()) # 修改后 player = pygame.sprite.GroupSingle() player_sprite = Player() player.add(player_sprite)player_sprite.rect.x即可。
额外需要注意的代码问题
- 你的
Obstacles类__init__方法里没有初始化self.rect属性,只有调用obstacle_spawn时才会给rect赋值,实例刚创建的时候如果触发绘制会直接报错。而且你当前的逻辑是触发OBSTACLESPAWN事件时调用已有障碍物的update,不是新增管道,永远只会有一个管道,正确逻辑应该是触发事件时新建Obstacles实例加入obstacle组。 Player类的collision方法里直接写GAME_ACTIVE = 0只会修改方法内的局部变量,不会改动全局的GAME_ACTIVE状态,需要在方法内加global GAME_ACTIVE声明才能正常修改全局游戏状态。
内容的提问来源于stack exchange,提问作者Snabba_Snigeln
相关产品推荐
相关产品推荐

