原因:
碰撞测试依靠 Sprite 对象的 rect 属性来确定它们是否相交。但是,代码中的 get_rect() 方法未正确将矩形的位置设置为预期坐标。
解决方案:
使用 get_rect() 时,您可以使用关键字参数指定位置或将其分配给矩形的左上角虚拟属性。使用此更正后的代码:
self.rect = self.image.get_rect(topleft=(self.x, self.y))
原因:
您向精灵添加了不必要的 x 和 y 属性,而不是依赖在矩形的位置上。结果,矩形的位置始终设置为 (0, 0),因为 Surface 对象没有默认位置。
解决方案:
删除 x 和 y 属性并使用 rect 属性设置 Sprite 对象的位置。这是更正后的代码:
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
您可以通过使用 pygame.sprite.Group 来管理 Sprite 对象来进一步简化代码。这将自动处理绘制和更新。
obstacle = Obstacle() ball = Ball() # Create a sprite group and add the sprites to it. all_sprites = pygame.sprite.Group([obstacle, ball]) while not crashed: # [... event handling and game logic] gameDisplay.fill((255, 255, 255)) # Draw all sprites using the group's draw method. all_sprites.draw(gameDisplay) # [... other game loop tasks]
以上是为什么我的 Pygame 碰撞检测总是返回 True,以及为什么我的图像矩形位置错误地设置为 (0, 0)?的详细内容。更多信息请关注PHP中文网其他相关文章!