Wie erstelle ich Kollision Erkennungen für meine hüpfende Bälle?
Habe ich codiert eine animation (in python) für drei Strand Bälle hüpfen, ein Bildschirm. Jetzt will ich Sie alle treffen aufeinander und können voneinander abprallen. Ich würde wirklich zu schätzen jede Hilfe, die angeboten werden können.
import pygame
import random
import sys
class Ball:
def __init__(self,X,Y):
self.velocity = [1,1]
self.ball_image = pygame.image.load ('Beachball.jpg'). convert()
self.ball_boundary = self.ball_image.get_rect (center=(X,Y))
self.sound = pygame.mixer.Sound ('Thump.wav')
self.rect = self.ball_image.get_rect (center=(X,Y))
if __name__ =='__main__':
width = 800
height = 600
background_colour = 0,0,0
pygame.init()
window = pygame.display.set_mode((width, height))
pygame.display.set_caption("Bouncing Ball animation")
num_balls = 3
ball_list = []
for number in range(num_balls):
ball_list.append( Ball(random.randint(10, (width - 10)),random.randint(10, (height - 10))) )
while True:
for event in pygame.event.get():
print event
if event.type == pygame.QUIT:
sys.exit(0)
window.fill (background_colour)
for ball in ball_list:
if ball.ball_boundary.left < 0 or ball.ball_boundary.right > width:
ball.sound.play()
ball.velocity[0] = -1 * ball.velocity[0]
if ball.ball_boundary.top < 0 or ball.ball_boundary.bottom > height:
ball.sound.play()
ball.velocity[1] = -1 * ball.velocity[1]
ball.ball_boundary = ball.ball_boundary.move (ball.velocity)
window.blit (ball.ball_image, ball.ball_boundary)
pygame.display.flip()
- Fragte ich eine ähnliche Frage vor einiger Zeit: Ball-zu-Ball-Kollision Erkennung und Behandlung. Habe einige gute Antworten gibt es auch.
- mögliche Duplikate von Ball-zu-Ball-Kollision - Erkennung und Behandlung
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kollisionserkennung für beliebige Formen ist in der Regel Recht schwierig, da Sie haben, um herauszufinden, wenn jedes pixel kollidiert.
Dies ist tatsächlich einfacher mit Kreisen. Wenn man zwei Kreise mit radius r1 und r2, eine Kollision aufgetreten ist, wenn der Abstand zwischen den Zentren ist weniger als r1+r2.
Den Abstand zwischen den beiden Zentren (x1,y1) und (x2,y2) berechnet werden und verglichen:
Oder, wie jfclavette Punkte aus, Quadratwurzeln sind teuer und so ist es vielleicht besser zu berechnen mit nur einfache Operationen:
Den schwierigen Teil, kommt bei der Berechnung der neuen Bewegung von Vektoren (die rate, mit der (x,y) ändert sich im Laufe der Zeit für ein bestimmtes Objekt), da müssen Sie berücksichtigen die aktuelle Bewegung Vektoren und Ansprechpartner.
Ich denke, als ersten Schnitt, sollten Sie nur in umgekehrter Bewegung Vektoren um zu testen, ob die Kollisionserkennung funktioniert ersten.
Dann eine andere Frage stellen - es ist besser, halten die einzelnen Fragen so Antworten können gezielt angesprochen werden.
Erkennen einer Kollision ist nur der erste Schritt. Lassen Sie uns brechen, dass nach unten.
Das Schnellste, was zu tun ist, berechnen Sie die quadratische bounding-Boxen und sehen, ob diese kollidieren. Zwei Seiten brauchen, um zu überqueren (oben 1 und unten oder 2, und Links von 1 und rechts von 2, oder Umgekehrt), um für die bounding boxes überlappen. Keine überlappungen, keine Kollision.
Nun, wenn Sie tun überlappen, Sie müssen berechnen Sie die Entfernung zwischen Ihnen. Wenn dieser Abstand mehr als die Summe der Radien der Kugeln, dann keine Kollision.
Okay! Wir haben zwei Kugeln miteinander kollidieren. Jetzt was? Gut, Sie haben, um voneinander abprallen. Die Art, wie Sie hüpfen, hängt von einigen Faktoren ab.
Die erste ist Ihre Elastizität. Zwei Gummi-Bälle abprallen einander rebound-anders als zwei Glaskugeln.
Die zweite ist Ihre Anfangsgeschwindigkeit. Trägheit besagt, dass Sie wollen, um zu halten, gehen meist in die gleiche Richtung, die Sie begonnen wurde.
Die Dritte ist die Masse der Bälle. Ein ball mit kleiner Masse erholen wird aus einem viel größeren Masse eine höhere Geschwindigkeit.
Lassen Sie sich mit der zweiten und Dritten Faktoren, Erstens, weil Sie miteinander verflochten sind.
Zwei Bälle werden nur selten trifft genau tot auf. Glancing blows sind weit wahrscheinlicher. In jedem Fall wird die Wirkung geschehen entlang der normalen der Tangente, wo die Kugeln kollidieren. Sie müssen berechnen Sie die Vektor-Komponente sowohl entlang dieser normalen gegeben, Ihre Anfangsgeschwindigkeiten. Dies wird in einem paar von normalen Geschwindigkeiten, dass beide Bälle zu bringen, um die Kollision. Addieren Sie die Summe, und speichern Sie es irgendwo praktisch.
Nun müssen wir herausfinden, was jeder ball wird Weg von ihm. Die resultierende Normalgeschwindigkeit jeder ball ist Umgekehrt proportional zu der gegebenen ball der Masse. Das heißt, die wechselseitige jeder ball der Masse, fügen Sie die beiden Massen zusammen, und dann Paket aus den resultierenden normal-Geschwindigkeit Weg von der Kollision basierend auf dem Verhältnis der den ball in der Masse der Summe der reziproken der beiden ball der Massen. Dann fügen Sie die tangentialgeschwindigkeit auf, und Sie erhalten die resultierende Geschwindigkeit des Balles.
Elastizität ist größtenteils die gleiche, außer es erfordert einige grundlegende Kalkül, aufgrund der Tatsache, dass die Kugeln sind noch in Bewegung, selbst als Sie zu komprimieren. Ich überlasse es Ihnen, herauszufinden, die entsprechenden math.
Erkennung von Kollisionen war gut abgedeckt von Pax Antwort. Mit Bezug zu Objekten abprallen einander, ich schlage vor, Check-out die folgenden links über die elastische Kollisionen, inelastische Kollisionen, und Koeffizienten der Wiedergutmachung.
EDIT: ich habe gerade bemerkt, dass dieser bedeckt war,eine andere Frage, wenn auch nicht speziell für Python. Sie sollten auch prüfen, es gibt für einige gute links.
Ich denke, es ist somehthing einfacher, dass Sie Jungs sind, fehlt besonders bei betrachtend, das er mit pygame.
Aufruf der
get_rect
- Funktion können wahrscheinlich boundraies für die Bilder und denRect
erstellt wird, ist für die Berechnung der position des Bildes und wenn es mehr als ein Objekt in der animation, es kann verwendet werden, für die Erkennung von Kollisionen.colliderect
&rect
können verwendet werden, problem ist, ich habe keine Idee wie man das umsetzen würden es vor allem für eine unbekannte Anzahl von Kugeln.Halten Sie im Verstand es ist python.
Zurück in die guten alten Zeiten, wenn die CPU-Zyklen wurden eine premium-Programmierer verwendet einen einfachen trick, um zu erkennen, Kollision: Sie verwendet diese Farben, die Sie sehen konnten, aus dem pixel die Farbe, wenn es im hintergrund oder ein Objekt. Dies wurde getan, zumindest einige C64-Spiele.
Weiß nicht, ob Sie bereit sind, diesen Weg zu gehen, obwohl..
Zunächst müssen Sie prüfen, Kollision mit
rect.colliderect(other_rect)
nach, dass, wenn Sie kollidieren, können Sie überprüfen, pixelgenaue Kollision. Damit Sie nicht Durcheinander mit Objekt hat einen radius oder Form.
Für pixelgenaue Kollisionsprüfung, ich benutze Masken:
Beide maskieren von Objekten mit
mask.from_surface
, dann legte Sie aufMask.overlap
Funktion.Machte ich ein python-collision detection if-Anweisung, hier ist es:
In Ihrem Fall, mit 3 hüpfende Bälle, Sie haben zu 2 if-Anweisungen dieses format für jeden ball, um sicherzustellen, dass die Kollisionsabfrage einwandfrei. Ich hoffe, das hilft.