碰撞检测和精灵定位故障排除
在您的代码中,您遇到两个问题:collide_rect 函数始终返回“True”,甚至当它不应该时,代表精灵的矩形的位置似乎是(0, 0).
让我们首先解决碰撞检测。 collide_rect 总是返回“True”的原因是您没有正确设置矩形的位置。 pygame.Surface.get_rect() 返回一个具有表面尺寸的矩形对象,但它始终从 (0, 0) 开始。要将矩形放置在精灵的位置,您需要使用以下方法之一:
self.rect = self.image.get_rect(topleft=(self.x, self.y))
或
self.rect = self.image.get_rect() self.rect.topleft = (self.x, self.y)
通过设置矩形的 topleft 属性,您可以显式地将其与精灵的位置对齐。
至于不正确的精灵位置,您引入了不必要的 self.x 和 self.y 属性。更好的做法是直接依赖矩形的位置。这是一个删除属性并在 get_rect() 调用中设置左上角位置的示例:
class Ball(pygame.sprite.Sprite): def __init__(self): pygame.sprite.Sprite.__init__(self) self.image = pygame.image.load("ball.png") self.rect = self.image.get_rect(topleft=(280, 475)) self.col = False class Obstacle(pygame.sprite.Sprite): def __init__(self): pygame.sprite.Sprite.__init__(self) self.image = pygame.image.load("obstacle.png") self.rect = self.image.get_rect(topleft=(1000, 483))
此外,您可以选择利用 pygame.sprite.Group 来处理精灵渲染和更新。这简化了绘制过程,因为它绘制了组中的所有精灵:
all_sprites = pygame.sprite.Group([obstacle, ball]) while not crashed: # [...] gameDisplay.fill((255,255,255)) all_sprites.draw(gameDisplay) pygame.display.flip() clock.tick(1000)
请注意,如果您使用 Group,则可以删除 Ball.update() 和 Obstacle.update() 方法,因为它们将处理更新精灵的位置并将图像绘制到显示器上。
以上是为什么我的 Pygame 碰撞检测总是 True,为什么我的精灵位于 (0, 0)?的详细内容。更多信息请关注PHP中文网其他相关文章!