如何在python pygame中减少掩码碰撞检测的延迟



我正尝试着为我所创造的游戏创造一个碰撞检测系统。当我检测物体较小的碰撞时,这段代码工作得很好,但是现在,一旦我制作了一个月亮的蒙版,它的直径可以达到1000像素,它就开始延迟我的计算机。我试着制作月球轮廓的第二张图像来检测碰撞,但经过进一步的测试,它仍然会在轮廓的中间(在图像的透明部分)检测碰撞,并没有帮助延迟。我还尝试使轮廓图像像素更少,但保持相同的大小。当一艘船在屏幕上移动以躲避它们时,图像会在屏幕上向下移动。我需要像素完美的碰撞如果有人能告诉我如何减少延迟,或者其他检测我的船是否在圆圈内的方法,那将是一个很大的帮助:)

for i in range(numMoon):
moonRect = pygame.Rect(moonX[i], moonY[i], int(100*moonScale[i]), int(100*moonScale[i]))
if moonRect.colliderect(shipRect):
moonMask = pygame.mask.from_surface(moon)
offset_x = shipRect.x - moonRect.x
offset_y = shipRect.y - moonRect.y
crash = moonMask.overlap(shipMask, (offset_x, offset_y))
if crash:
print('moon')

Surface创建Mask是一个开销很大的操作。不生成环路中的pygame.mask。加载图像后,在初始化时直接创建掩码:

moon = pygame.image.load(...)
moonMask = pygame.mask.from_surface(moon)

使用预生成的掩码

for i in range(numMoon):
moonRect = pygame.Rect(moonX[i], moonY[i], int(100*moonScale[i]), int(100*moonScale[i]))
if moonRect.colliderect(shipRect):
offset_x = shipRect.x - moonRect.x
offset_y = shipRect.y - moonRect.y
crash = moonMask.overlap(shipMask, (offset_x, offset_y))
if crash:
print('moon')