Pygame colliderect导致ball gam出现问题

2024-05-10 01:14:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我在做一个推杆游戏。我用类制作了墙和球,每个类都有一个矩形来定义它的位置。所有的墙都在一个列表中,我使用colliderect检查列表,看球是否碰到了任何墙。如果是这样,根据墙(垂直或水平),我改变球的方向。问题是,偶尔,球会撞到墙上,卡在里面。我想象它只是不断地与墙壁相撞,不断地改变方向,使它保持静止。你知道吗

我试着增加一个冷却时间,但即使这样也不总是奏效。球的速度不应该是一个问题,如果它每帧移动3倍,如果它的方向改变后在下一帧移动相同的速度。然而,较慢的速度有帮助,但仍然不能完全解决这个问题。另外,我在每一帧上移动球之前检测碰撞。你知道吗

for wall in walls:
    if wall.type == "hwall":
        if wall.rect.colliderect(ball.rect):
            ball.y_change = -(ball.y_change)
    elif wall.type == "vwall":
        if wall.rect.colliderect(ball.rect):
            ball.x_change = -(ball.x_change)

以下是完整代码: https://pastebin.com/85Ge175i


Tags: rect游戏列表if定义type水平方向
2条回答

尝试了所有建议的方法,但没有一种对我有效。放弃使用pygame colliderect功能,因为它似乎不适合我的特定需求。相反,我检查了所有墙壁上的球的位置,然后手动碰撞。另外,在碰撞时,我会将球向后移动一点,以防止它卡在墙上。你知道吗

# Check for collision
for wall in walls:
    if wall.type == "hwall":

        if ball.y_change < 0:
            if wall.rect.top <= ball.rect.top <= wall.rect.bottom and wall.rect.left <= ball.rect.center[0] <= wall.rect.right:
                ball.y_change = -(ball.y_change)
                ball.y += speed_y * 2
        else:
            if wall.rect.top <= ball.rect.bottom <= wall.rect.bottom and wall.rect.left <= ball.rect.center[0] <= wall.rect.right:
                ball.y_change = -(ball.y_change)
                ball.y -= speed_y * 2


    elif wall.type == "vwall":

        if ball.x_change < 0:
            if wall.rect.left <= ball.rect.left <= wall.rect.right and wall.rect.top <= ball.rect.center[1] <= wall.rect.bottom:
                ball.x_change = -(ball.x_change)
                ball.x += speed_x * 2
        else:
            if wall.rect.left <= ball.rect.right <= wall.rect.right and wall.rect.top <= ball.rect.center[1] <= wall.rect.bottom:
                ball.x_change = -(ball.x_change)
                ball.x -= speed_x * 2

一个快速的解决方案是不仅要检查碰撞,还要检查墙和球的矩形边缘的位置。
代码应该是不言自明的:

for wall in walls:
    if wall.rect.colliderect(ball.rect):
        if wall.type == "hwall" and wall.rect.bottom < ball.rect.bottom and ball.y_change > 0:
            ball.y_change = -(ball.y_change)
        elif wall.type == "hwall" and wall.rect.top > ball.rect.top and ball.y_change < 0:
            ball.y_change = -(ball.y_change)
        elif wall.type == "vwall" and wall.rect.right < ball.rect.right and ball.x_change > 0:
            ball.x_change = -(ball.x_change)
        elif wall.type == "vwall" and wall.rect.left > ball.rect.left and ball.x_change < 0:
            ball.x_change = -(ball.x_change)

这样你就可以确定一旦速度分量被翻转,它就不会立即被翻转回来。你知道吗

相关问题 更多 >