Ich möchte ein Skript in Pygame erstellen, in dem zwei Bälle aufeinander zufliegen und wenn sie kollidieren, sollten sie voneinander abprallen, aber ich weiß nicht, wie das geht. Können Sie mir helfen?
Pygame, wie man Bälle kollidieren lässt
UdayanS
Rabbid76
Um zu erkennen, ob 2 Kreise (bzw. Kugeln) kollidieren, müssen Sie testen, ob die Euklidische Entfernung zwischen den Kreismittelpunkten kleiner als die Summe der Radien ist. Ich empfehle zu verwenden pygame.math.Vector2
/ distance_to()
für die Berechnung.
Im Folgenden wird der 1er Kreis durch den Mittelpunkt definiert (x1, y1) und der radius r1. Der 2. Kreis ist definiert durch (x2, y2) und r2:
v1 = pygame.math.Vector2(x1, y1)
v2 = pygame.math.Vector2(x2, y2)
if v1.distance_to(v2) < r1 + r2:
print("hit")
Wenn Sie die Kreise zum Springen bringen möchten, müssen Sie den Bewegungsvektor des Kreises wie eine Billardkugel auf den Normalenvektor des Schnittpunkts spiegeln. Benutzen pygame.math.Vector2
/ reflect_ip()
oder reflect()
um die neue Richtung des Kreises zu berechnen.
Die Bewegungen der Kreise sind gegeben durch (mx1, my1) und (mx2, my2):
nv = v2 - v1
m1 = pygame.math.Vector2(mx1, my1).reflect(nv)
m2 = pygame.math.Vector2(mx2, my2).reflect(nv)
mx1, my1 = m1.x, m1.y
mx2, my2 = m2.x, m2.y
Minimalbeispiel: repl.it/@Rabbid76/PyGame-CirclesBounceOff
import pygame
pygame.init()
width, height = 400, 400
window = pygame.display.set_mode((width, height))
clock = pygame.time.Clock()
x1, y1, r1, mx1, my1 = 200, 200, 50, 2, 0.5
x2, y2, r2, mx2, my2 = 300, 200, 50, -1, -1.5
def move(c, v, r, m):
c += v
if c < r: c, v = r, -v
if c > m-r: c, v = m-r, -v
return c, v
hit_count = 0
run = True
while run:
clock.tick(60)
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
x1, mx1 = move(x1, mx1, r1, width)
y1, my1 = move(y1, my1, r1, height)
x2, mx2 = move(x2, mx2, r2, width)
y2, my2 = move(y2, my2, r2, height)
v1 = pygame.math.Vector2(x1, y1)
v2 = pygame.math.Vector2(x2, y2)
if v1.distance_to(v2) < r1 + r2 - 2:
hit_count += 1
print("hit:", hit_count)
nv = v2 - v1
m1 = pygame.math.Vector2(mx1, my1).reflect(nv)
m2 = pygame.math.Vector2(mx2, my2).reflect(nv)
mx1, my1 = m1.x, m1.y
mx2, my2 = m2.x, m2.y
window.fill((127, 127, 127))
pygame.draw.circle(window, (255, 0, 0), (round(x1), round(y1)), r1, 4)
pygame.draw.circle(window, (0, 0, 255), (round(x2), round(y2)), r2, 4)
pygame.display.flip()
-
Danke, @Rabid76, es hat wirklich geholfen!
– UdayanS
5. August ’20 um 21:11
Es ist ziemlich einfach, dass Sie einfach überprüfen, ob sich die x-Koordinate an derselben Stelle befindet wie die andere x-Koordinate. Wenn Sie zum Beispiel eine der x-Koordinaten namens x und eine andere namens i (es gibt 2 x-Koordinaten für beide Kugeln) haben, können Sie einfach sagen, ob oh und bevor ich etwas anderes sage, ist dieses Beispiel für Ihr Pygame-Fenster geeignet ist ein 500.500. Man könnte sagen, wenn x == 250: x -= 15. Und umgekehrt für i. Wenn i == 250: i += 15. Los geht’s!. Natürlich müssen Sie ein paar Änderungen vornehmen, aber dies ist der grundlegende Code, und ich denke, Sie würden das verstehen
.
Bitte poste den Code, den du aktuell hast
– Mike67
29. Juli ’20 um 2:40
Beantwortet das deine Frage? Pygame-Kreiskollision?
– AutMai
29. Juli ’20 um 8:24
[duplicate] stackoverflow.com/questions/27642234/pygame-circle-collision
– AutMai
29. Juli ’20 um 8:24
Um die Umleitung nach einer Kollision (Bounce-Effekt) zu berechnen, sollten Sie sich einige Tutorials ansehen, die visuell erklären, wie dies funktioniert. Habe gerade diesen hier herausgefunden: youtube.com/watch?v=nlwtgvZCz0k was kurz und klar zu sein scheint. Es ist nicht Python, aber die Konzepte werden die gleichen sein
– Apolo
29. Juli ’20 um 12:49
Vielleicht möchten Sie auch diese Community überprüfen, in der es um Spieleentwicklung geht: gamedev.stackexchange.com
– Apolo
29. Juli ’20 um 12:50