在两个图像之间使用遮罩的碰撞仅在特定点起作用
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))
我正在尝试检查一幅静态图像和一幅运动图像之间的碰撞。静态图像是气球,移动图像是枪。我试图创建一个函数来获取枪的矩形(使用 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))