Python pygame中球与矩形的碰撞

Python pygame中球与矩形的碰撞,python,pygame,Python,Pygame,我试图制作经典的街机游戏Arkanoid,但我在球和砖块之间的碰撞方面遇到了问题。目前我只使用经典碰撞(如Pong中的碰撞): 我的问题是,当球击中砖块的不同部分时,有时它会以错误的方式反弹,结果“吃”的比砖块还多。我使用了两种不同类型的碰撞,因为我添加了边界,我也在使它反弹,但我不知道如何让程序意识到砖块的哪一侧被击中,并根据侧面使用colision1或colision2。你在使用/绘制一个圆球吗?如果是这样,问题可能是因为您使用了colliderect。当球靠近砖块时,边界框碰撞的位置与它出

我试图制作经典的街机游戏Arkanoid,但我在球和砖块之间的碰撞方面遇到了问题。目前我只使用经典碰撞(如Pong中的碰撞):


我的问题是,当球击中砖块的不同部分时,有时它会以错误的方式反弹,结果“吃”的比砖块还多。我使用了两种不同类型的碰撞,因为我添加了边界,我也在使它反弹,但我不知道如何让程序意识到砖块的哪一侧被击中,并根据侧面使用
colision1
colision2

你在使用/绘制一个圆球吗?如果是这样,问题可能是因为您使用了colliderect。当球靠近砖块时,边界框碰撞的位置与它出现的位置略有不同。尝试使用精灵和碰撞圆。

只需在砖块的侧面添加一个标识符,然后检查碰撞是垂直还是水平。或者,如果你实现了一个合适的2D碰撞模型,你不需要关心碰撞的方向。你能给我一个如何添加标识符和检查的例子吗?还有,我能做一个合适的2D碰撞模型吗?我用的是一个圆球的图像。但是是的,我用的是colliderect。问题是,我不知道如何使用“碰撞圆”,因为碰撞发生在圆和矩形之间。你能给我举个例子吗?我会先用一个正方形精灵而不是一个圆来运行程序,以验证是边界框导致了问题。如果确认,并且您想要像素完美碰撞,您可以为所有精灵创建一个遮罩,并使用sprite.collide_mask()。另一个选项是继续使用矩形碰撞,但在每次碰撞时使用几何体测量从球中心到砖角的距离。这将告诉您球是碰到砖块,还是碰撞的只是边界框的一角。
def colision(self, objetivo):
    if self.rect.colliderect(objetivo.rect):
        self.speed[1] = -self.speed[1]

def colision2(self, objetivo):
    if self.rect.colliderect(objetivo.rect):
        self.speed[0] = -self.speed[0]