如何从pygame的sprite group精灵组中获取rect,解决Group无x属性报错
问题解决方法
错误原因
报错的核心原因是land为pygame.sprite.Group类型的精灵组对象,仅单个Landschaft精灵实例拥有rect属性,精灵组本身不包含该属性,调用land.rect.x自然会抛出属性不存在的异常。
你需要的碰撞精灵位置可以直接从pygame.sprite.spritecollide返回的hits列表中获取,该列表存储了所有和当前新创建的m精灵碰撞的已存在精灵实例。
修正代码
基础报错修复
仅修复打印报错的话,修改if hits分支的代码即可:
if hits: # 遍历所有碰撞到的精灵,打印对应rect的x坐标 for hit_sprite in hits: print(hit_sprite.rect.x) # 注意:当前for循环中i -= 1不会生效,for循环每次迭代会自动赋值range序列的下一个值,无法实现碰撞重试的效果
完整功能实现(支持碰撞后重新生成精灵)
如果你原本的需求是生成5个互不重叠的精灵,碰撞时重新生成当前精灵,可以将循环改为while逻辑:
class Landschaft(pygame.sprite.Sprite): def __init__(self,image): pygame.sprite.Sprite.__init__(self) self.image = image self.rect = self.image.get_rect() self.rect.x = random.randrange(60, breite -60) self.rect.y = random.randrange(100, hoehe - 200) self.rect.center = (self.rect.x, self.rect.y) land = pygame.sprite.Group() sprite_count = 0 while sprite_count < 5: image = gegend[sprite_count] m = Landschaft(image) hits = pygame.sprite.spritecollide(m, land, True) if hits: for hit_sprite in hits: # 打印碰撞精灵的x坐标 print(hit_sprite.rect.x) # 碰撞则跳过后续添加逻辑,重新生成当前精灵 continue land.add(m) sprite_count += 1
内容的提问来源于stack exchange,提问作者Joachim
相关产品推荐
相关产品推荐

