1

在这里,一旦它们发生碰撞,我就会冻结这两个图像。棒棒糖从左上角开始,熊从右下角开始。他们在中间相撞。我的位置告诉我它们的距离更近,不到 50 点

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

为什么情节告诉我与我看到的不同?为什么棒棒糖的位置参考位于图像的底部而熊位于顶部?以下是我如何对图像进行 blitting。

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)。


我怎样才能让我的图像比现在更接近碰撞?(当蓝色背景触摸时)

碰撞时两个图像之间的空间

以下是当棒棒糖从右侧来并从左侧承受时它们如何碰撞。在此处输入图像描述

这是它们从顶部/底部来时的碰撞方式lollipop[480, 291] bear[440, 261] distance: 49.491213409963144

在此处输入图像描述

我如何检查碰撞:

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

1 回答 1

1

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

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

对于矩形,您可以通过执行分离轴测试的最小形式来计算交点。

计算每个精灵的最小值和最大值x以及y边界,并将它们与每个精灵的组合半尺寸进行比较:

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实用程序。

于 2013-11-07T05:57:11.120 回答