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

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

Mary-Kate Olsen
发布: 2024-12-16 19:52:28
原创
288 人浏览过

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板