首页 >后端开发 >Python教程 >为什么我的 Pygame 碰撞检测总是 True,为什么我的精灵位于 (0, 0)?

为什么我的 Pygame 碰撞检测总是 True,为什么我的精灵位于 (0, 0)?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-12-16 19:52:28289浏览

Why is my Pygame collision detection always True, and why are my sprites positioned at (0, 0)?

碰撞检测和精灵定位故障排除

在您的代码中,您遇到两个问题: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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn