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值直到它们不再碰撞然后继续游戏循环的其余部分。 (这是我检查碰撞的方式,但我使用图像而不是精灵)希望这对您有所帮助。
我在 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值直到它们不再碰撞然后继续游戏循环的其余部分。 (这是我检查碰撞的方式,但我使用图像而不是精灵)希望这对您有所帮助。