python - colisiones - pygame español
Pygame-Detección de colisión con dos CÍRCULOS (1)
Simplemente verifique si la distancia entre los dos centros es menor que la suma de los radios. Imagina que los dos círculos apenas se tocan entre ellos (mira el gráfico a continuación), luego dibuja una línea entre los dos centros. La longitud de esa línea será la suma de los dos radios (o radios si eres latino). Entonces, si los dos círculos se cruzan, la distancia entre sus centros será menor que la suma de los radios, y si no se cruzan, será más que la suma.
Estoy haciendo un programa de detección de colisiones donde mi cursor es un círculo con un radio de 20 y debería cambiar un valor a VERDADERO cuando golpea otro círculo. Para fines de prueba, tengo un círculo estacionario en el centro de la pantalla con un radio de 50. Puedo probar si el círculo del cursor ha golpeado el círculo estacionario pero no funciona del todo bien porque en realidad está probando si es golpear un cuadrado en lugar de un círculo. No soy muy bueno con las matemáticas y no he podido encontrar la respuesta a esto. He encontrado cómo probar si el cursor lo está tocando, pero nunca dos objetos con dos radios diferentes.
¿Cómo controlo la colisión entre dos círculos? ¡Gracias!
Aquí está mi código:
#@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()