Pygame - 两个圆的碰撞检测

8 投票
1 回答
9442 浏览
提问于 2025-04-17 20:33

我正在制作一个碰撞检测程序,我的光标是一个半径为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”)。所以,如果这两个圆相交,它们的圆心之间的距离就会小于半径之和;如果不相交,距离就会大于半径之和。

enter image description here

撰写回答