2015-12-02 92 views
1

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

我遇到的问题是rect实际上与圆的大小实际上不一样,所以当你点击背景的时候,当圆很大但没有完全填满窗时,它会缩小而不是变大。它在圆圈内注册一个点击)。在某个点上,与圆相关的矩形与窗口的大小相同,即使圆没有完全填充它,导致在内部注册点击。

我的问题是我如何才能使用撞击检测的圆而不是比实际圆更大的矩形?

下面是相关代码:

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) 

回答

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 
... 
+0

非常感谢你懒惰!我在代码中实现了这一点,它完美地工作。 – Zonyc

0

当检测到点击,使处理程序确定它是否实际上是圆内。否则忽略它。

+0

谢谢您的回复。我相信我正在做一个检查,以确定点击是否在碰撞点的圆内。不幸的是,这只检查点击是否在由pygame.draw.circle创建的(不可见)矩形内,而不是实际上可见的绘制圆。 – Zonyc