Pygame圈及其相关的矩形用于碰撞检测

时间:2015-12-02 22:22:01

标签: python pygame

我遇到了Pygame绘制圆圈及其相关矩形的问题。当我绘制一个圆形如pygame.draw.circle(表面,颜色,中心,半径)时,它会创建一个矩形。我试图使用pygame.collidepoint(event.pos)进行碰撞检测,其中event.pos是鼠标点击的位置。我的窗口大小为500x400,背景为黑色,绘制的圆圈为蓝色。当我在圆圈外部(在黑色背景中)单击时,圆圈的大小应该通过将半径乘以int来增加。相反,当在圆圈内部记录点击时,圆圈会通过将半径除以int而缩小。

我遇到的问题是,矩形实际上与圆圈的大小不同,因此当圆圈较大但没有完全填满窗口时单击背景时,它会收缩而不是变大(即在圆圈内注册一个点击)。在某一点上,与圆相关联的矩形变成与窗口相同的大小,即使圆圈没有完全填充它,这导致在内部记录点击。

我的问题是我如何才能对圆圈使用命中检测,而不是比实际圆圈更大的矩形?

以下是相关代码:

def handleMouseDown(self, position):
    if self.circle.collidepoint(position):
        self.radius = self.radius // 2
    else:
        self.radius = self.radius * 2
    self.draw()

def draw(self):
    self.surface.fill(self.black)
    self.circle = pygame.draw.circle(self.surface, self.color, self.center, self.radius)

2 个答案:

答案 0 :(得分:1)

只需计算圆心和鼠标点击位置之间的距离:

x1, y1 = position
x2, y2 = self.circle.center
distance = math.hypot(x1 - x2, y1 - y2)

然后检查此距离是否小于或等于圆的半径:

if distance <= self.radius:
    self.radius = self.radius // 2
...

答案 1 :(得分:0)

当检测到单击时,让处理程序确定它是否实际位于圆圈内。否则忽略它。