在两个图像之间使用遮罩的碰撞仅在特定点起作用

Collisions using masks between two images only working at a certain point

我正在尝试检查一幅静态图像和一幅运动图像之间的碰撞。静态图像是气球,移动图像是枪。我试图创建一个函数来获取枪的矩形(使用 get_rect),检查 (7) 个气球之一(存储在列表中)是否具有相同的 x 坐标(x 坐标是随机生成的), 并打印出它与哪个气球相撞。但它似乎并不总是有效,而且只在特定位置有效。此外,当它应该打印它击中的气球的名称(变量名称)时,它会打印出类似 collision with [<Surface(444x250x32 SW)> 的内容。

编辑:根据 Rabbid 的建议,我在气球和枪周围做了一个遮罩,并尝试检查它们是否发生碰撞。他们仍然不工作,但我觉得我越来越近了。我也做了一个repl,所以你可以自己运行代码。 这里是:Repl

(当枪和气球在同一个位置时,它应该打印出它击中了哪个气球。)

如何正确检查这些图像之间的碰撞,并打印出哪个气球被击中?

pygame.Surface.get_rect.get_rect() returns 具有 Surface 对象大小的矩形,始终从 (0, 0) 开始,因为 Surface 对象没有位置。 Surface 在屏幕上的某个位置 blit。矩形的位置可以由关键字参数指定。例如,矩形的左上角可以用关键字参数 topleft 指定。例如:

gun_rect = gun.get_rect(topleft = (x, y))

读取How do I detect collision in pygame? and use pygame.Rect.collidepoint检测枪尖(gun_rect.topleft)与气球外接矩形(ballon_rect)的碰撞:

def check_collisions(x, y):
    for i in range(num_balloons):
        gun_rect = gun.get_rect(topleft = (x,y))
        ballon_rect = colors[i].get_rect(topleft = (balloon_list[i] - 100, y-90))
        if ballon_rect.collidepoint(gun_rect.topleft):
            print(f'collision with {colors[i]}')
while running: # Game loop #
    # [...]

    check_collisions(x, y)

    # [...]

请注意,气球的位置是 (balloon_list[i] - 100, y-90),因为您是在那个位置画的:

def draw_balloons(y):
   for i in range(num_balloons):
       screen.blit(colors[i], (balloon_list[i] - 100, y-90))