Pygame - 两个圆的碰撞检测
我正在制作一个碰撞检测程序,我的光标是一个半径为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 个回答
22
只需要检查一下两个圆心之间的距离是否小于两个圆的半径之和。想象一下这两个圆刚好碰到了一起(看下面的图),然后在两个圆心之间画一条线。这条线的长度就是两个半径的总和(如果你是学拉丁语的,可以叫它们“radii”)。所以,如果这两个圆相交,它们的圆心之间的距离就会小于半径之和;如果不相交,距离就会大于半径之和。