Pygame, wie man Bälle kollidieren lässt

Lesezeit: 3 Minuten

Pygame wie man Balle kollidieren lasst
UdayanS

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?

  • 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

Pygame wie man Balle kollidieren lasst
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: 1641759771 316 So drehen Sie das Sprite in Pygame wahrend Sie sich repl.it/@Rabbid76/PyGame-CirclesBounceOff

Pygame wie man Balle kollidieren lasst

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

.

434330cookie-checkPygame, wie man Bälle kollidieren lässt

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy