Pygame - 两个CIRCLES的碰撞检测

时间:2014-03-03 00:35:50

标签: python pygame collision geometry

我正在进行碰撞检测程序,其中我的光标是一个半径为20的圆,当它碰到另一个圆时应该将值更改为TRUE。出于测试目的,我在屏幕中心有一个半径为50的静止圆。我能够测试光标圆是否已经击中静止圆但是它不能正常工作,因为它实际上正在测试它是否是击中正方形而不是圆形。我对数学不是很好,我也找不到答案。我已经找到了如何测试光标是否触摸它但是从未测试过具有两个不同半径的两个对象。

如何检查两个圆圈之间的碰撞?谢谢!

这是我的代码:

#@PydevCodeAnalysisIgnore
#@UndefinedVariable
import pygame as p, sys, random as r, math as m
from pygame.locals import *
from colour import *

p.init()

w,h=300,300
display = p.display.set_mode([w,h])
p.display.set_caption("Collision Test")
font = p.font.SysFont("calibri", 12)

x,y=150,150
radius=50
cursorRadius=20
count=0
hit=False

while(True):
    display.fill([0,0,0])
    mx,my=p.mouse.get_pos()
    for event in p.event.get():
        if(event.type==QUIT or (event.type==KEYDOWN and event.key==K_ESCAPE)):
            p.quit()

    ### MAIN TEST FOR COLLISION ###
    if(mx in range(x-radius,x+radius) and my in range(y-radius,y+radius)):
        hit=True
    else:
        hit=False

    p.draw.circle(display,colour("blue"),[x,y],radius,0)
    p.draw.circle(display,colour("white"),p.mouse.get_pos(),cursorRadius,0)

    xy=font.render(str(p.mouse.get_pos()),True,colour("white"))
    hitTxt=font.render(str(hit),True,colour("white"))
    display.blit(xy,[5,285])
    display.blit(hitTxt,[270,285])

    p.display.update()

1 个答案:

答案 0 :(得分:13)

检查两个中心之间的距离是否小于半径之和。想象一下,两个圆圈几乎没有相互接触(见下图),然后在两个中心之间画一条线。该行的长度将是两个半径的总和(如果您是拉丁语,则为半径)。因此,如果两个圆相交,它们的中心之间的距离将小于半径的总和,如果它们不相交,则它将超过总和。

enter image description here