Pygame图像碰撞在视觉上留下图像之间的间隙

时间:2013-11-07 01:57:08

标签: python graphics pygame collision-detection

在这两个图像碰撞后我立即冻结它们。棒棒糖从左上角开始,熊从右下角开始。他们在中间碰撞。我的立场告诉我他们距离更近,距离不到50分

以下是棒棒糖在坐标中与熊的距离: lollipop[452, 320] and bear[448, 330] distance between the two: 10.742572683895418

为什么情节告诉我与我看到的不同?为什么棒棒糖的位置参考位于图像的底部,而熊位于顶部?这是我如何blits图像。

rect = surface1.get_rect()
rect = rect.move(position[0]-rect.width//2, position[1]-rect.height//2)
screen.blit(surface1, rect)

图像尺寸分别为(50,50)和(100,100)。


如何让我的图像比现在更容易碰撞? (当蓝色背景触及时)

Space between two images when they collided

当棒棒糖从右侧射出并从左侧承受时,它们是如何碰撞的。 enter image description here

以下是来自顶部/底部lollipop[480, 291] bear[440, 261] distance: 49.491213409963144

时发生碰撞的方式

enter image description here

我如何检查碰撞:

def distance(p, q):
return math.sqrt((p[0]-q[0])**2 + (p[1]-q[1])**2)

1 个答案:

答案 0 :(得分:1)

如果我理解,你试图将精灵中心之间的距离与其中一个精灵的大小进行比较。这对于矩形来说是不正确的。

首先,您使用的公式是圆圈。在这种情况下,您必须将距离与圆的组合半径进行比较。

对于矩形,您可以通过执行Separating Axis Test的最小形式来计算交点。

计算每个精灵的最小和最大xy界限,并将它们与每个精灵的组合半尺寸进行比较:

halfWidthSprite1 = sprite1.width//2
halfWidthSprite2 = sprite2.width//2
halfHeightSprite1 = sprite1.height//2
halfHeightSprite2 = sprite2.height//2
distanceX = abs(sprite1.center[0] - sprite2.center[0])
distanceY = abs(sprite2.center[1] - sprite2.center[1])

collision = (distanceX < (halfWidthSprite1 + halfWidthSprite2)) and
            (distanceY < (halfHeightSprite1 + halfHeightSprite2))

如评论中所述,您还可以使用内置pygame.sprite.collide_rect实用程序。