Pygame 玩家精灵和平台精灵之间像素完美碰撞的掩码

Pygame mask for pixel perfect collision between player sprite and platform sprites

我在 pygame 中使用遮罩成功检测到我的玩家精灵和平台精灵之间的碰撞,但我的问题是阻止玩家在跳到平台时掉落平台。

我尝试使用 mask.overlap() 解决问题。使用它,我能够识别我的玩家精灵在碰撞过程中与平台接触的点。当玩家精灵(她的鞋子)的底部与平台碰撞时,她应该停止掉落。我可以从 mask.overlap() 得到这个点,我在程序中硬编码了这个点的 y 坐标(这是精灵本身的一个点,而不是屏幕上的一个点)y = 155

hits = pygame.sprite.spritecollide(player, platform_group, False)
if hits:
    hits = pygame.sprite.spritecollide(player, platform_group, False, pygame.sprite.collide_mask)
    for platform in hits:
        offset = (platform.rect.x - player.rect.x), (platform.rect.y - player.rect.y)
        if player.mask.overlap(platform.mask, offset):
            x = player.mask.overlap(platform.mask, offset)[0]
            y = player.mask.overlap(platform.mask, offset)[1]
            pygame.draw.circle(display, s.RED, (x + player.rect.x, y + player.rect.y), 2)
            print('Sprite pixel coll y: ' + str(y), 'Platform rect y top: ' + str(platform.rect.top))

        if y == 155:
            player.v_y = 0
            player.rect.y = platform.rect.y - y

红点是检测到玩家精灵碰撞的点。

当前代码的问题(除了它是一个非常丑陋的解决方案之外)是它不适用于所有情况。当玩家下落速度太快时,检测到的碰撞点将不是她的脚(即不是 y = 155´ 时),并且她会从平台上掉下来,因为 if 条件不会满足。 我可以尝试像 if y >= 145 and y <= 160: 这样的限制,但这仍然不能涵盖所有情况,并且可能导致她在着陆时“反弹”起来。

我目前陷入困境,想知道是否有人有任何建议。我知道我可以使用 sprite Rects 和 colliderect,但这不会给我想要的效果。

非常感谢

你可以检查角色是否在接触平台(使用mask.overlap方法)然后将速度设置为0并逐渐增加y值直到它们不再碰撞然后继续游戏循环的其余部分。 (这是我检查碰撞的方式,但我使用图像而不是精灵)希望这对您有所帮助。