对象碰撞适用于向右移动,但不适用于向左移动

Object collision works for the right movement, but not left

所以我已经在这个项目上工作了一个星期左右,但我一直无法完善矩形对象的碰撞。它适用于方块上方和下方的碰撞,甚至当你在方块的右侧时也能很好地处理碰撞,但我无法弄清楚当玩家在左侧时如何解决碰撞。

靠墙移动时效果很好,但当您在共享相同 y 坐标的 2 个方块之间向左移动时,玩家会停下来,就好像有一堵墙挡住了路。

这是与玩家右侧的方块发生碰撞的代码,它按预期工作:

# character to the left of the block
if p1.x + p1.width / 2 < block.x and p1.dx > 0:
    p1.dx = 0
    p1.x = block.x - p1.width

而这是导致问题的代码:

# player is to the right of the block
elif p1.x + p1.width/2 > block.x + block.width and p1.dx < 0:
    p1.dx = 0
    p1.x = block.x + block.width

使用轴对齐边界块方法检查碰撞,块的 x 和 y 坐标位于左上角。

任何试图解决这个问题的人, 谢谢:)

您可能需要添加其他条件:

if p1.x + p1.width / 2 < block.x < p1.x + p1.width and p1.dx > 0:
    p1.dx = 0
    p1.x = block.x - p1.width

elif p1.x < block.x + block.width < p1.x + p1.width/2 and p1.dx < 0:
    p1.dx = 0
    p1.x = block.x + block.width

不使用 pygame.Rect 个对象可以大大简化代码:

p1_rect = pygme.Rect(p1.x, p1.y, p1.width, p1.height)
block_rect = pygme.Rect(block.x, block.y, block.width, block.height)

if p1_rect.center < block_rect.left < p1_rect.right and p1.dx > 0:
    p1.dx = 0
    p1_rect.right = block_rect.left
    p1.x = p1_rect.x

elif p1_rect.left < block_rect.right < p1_rect.center and p1.dx < 0:
    p1.dx = 0
    p1_rect.left = block_rect.right
    p1.x = p1_rect.left

另见 How do I detect collision in pygame?