"Kollision" von zwei Bällen erkennen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
fragezeichen123
User
Beiträge: 18
Registriert: Donnerstag 7. April 2016, 19:32

Hallo Forum,

ich bin Python-"Einsteiger" und muss für die Schule ein kleines, kurzes Spiel programmieren:

-IDEE-
Es gibt einen Ball (einfacher Kreis) der vom Spieler mithilfe der Maus gesteuert wird. Ziel des Spiels ist es letztendlich nur, dass der eigene Ball einen anderen, zufällig generierten Ball berührt. Mit dieser Berührung "frisst" er ihn theoretisch auf. (Der Kreis bewegt sich nicht, sondern bleibt an seiner Stelle)
Das war's im Grunde schon... weitere Details werde ich warscheinlich später noch programmieren.

-UMSETZUNG-
Den vom Spieler bewegten Ball und den zufällig programmierten Ball habe ich bereits fertig.
Jedoch weiß ich nicht, wie ich es hinbekomme, dass, wenn ich mit meinem selbstgesteuerten Ball den festen Ball berühre, dass dieser verschwindet. Ich habe schon versucht, dies mithilfe der Koordinaten hinzubekommen, aber irgendwie schaffe ich das nicht.

Wäre nett, wenn Ihr mir helfen könntet... falls Ihr etwas nicht verstanden, fragt gerne nach!

LG
fragezeichen123
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

@fragezeichen123: ja Koordinaten sind schon mal ein guter Anfang. Was hast Du bereits versucht?
fragezeichen123
User
Beiträge: 18
Registriert: Donnerstag 7. April 2016, 19:32

Code: Alles auswählen

### Ball trifft auf Zufallsball ###
XKoordinatenBALL = meinKreis.getX - 20                                                       
YKoordinatenBALL = meinKreis.getY - 20
XKoordinatenZUFALL = Zufallsball1.getX  - 20
YKoordinatenZUFALL = Zufallsball1.getY  - 20


while True:
    if range(XKoordinatenBALL, 25) == range(XKoordinatenZUFALL, 25):
        meinKreis.undraw()              
        meinFenster.close()

Das mit dem range habe ich gemacht, weil ja nicht nur der eine Kreismittelpunkt des Zufallsballes als kollidiert erkannt werden soll, sondern auch wenn ich den Rand berühre... weiß aber leider nicht, ob das richtig ist :(
Zuletzt geändert von Anonymous am Freitag 8. April 2016, 08:54, insgesamt 1-mal geändert.
Grund: Quelltext in Code-Tags gesetzt.
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Der Gedanke ist nicht schlecht, aber so funktioniert ein Vergleich von Listen (und das kommt bei range ja raus) nicht - der testet ob zwei Listen gleich sind.

Und range(a, b) liefert auch den Wertebereich a, a+1, a+2, ... b. Wenn b < a, dann funkttioniert das nicht. Wenn du also an Koordinate 100 bist, und range(100, 25) benutzt, dann kommt da eine leere Liste raus.

Wenn muesstest du range(100, 100 + 25) machen. Und dann schauen, ob es Elemente in einer von beiden Listen gibt, die auch in der anderen sind.

Das geht alles - aber das ist komplizierter als notwendig.


schau dir mal pygame.Rect an. http://www.pygame.org/docs/ref/rect.html

Das sollte eigentlich genau das richtige sein.
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

@fragezeichen123: Du hast ja schon mal die Mittelpunkt Deiner Kreise, was ja schon mal ein Anfang ist. Die Kreise berühren sich wenn der Abstand der Mittelpunkte kleiner ist als die Summe ihrer Radien. Zum Berechnen des Abstands hilft Dir der gute alte Pythagoras.

Bei eventbasierten Programmen ist es ein Fehler Endlosschleifen zu benutzen. Wo soll denn da die neue Mausposition ermittelt werden?
Mit range ist kein Abstand gemeint, sondern das ist eine Funktion die eine Liste mit Zahlen liefert. Und zwei Listen zu vergleichen, macht hier keinen Sinn.
fragezeichen123
User
Beiträge: 18
Registriert: Donnerstag 7. April 2016, 19:32

Aber was muss ich machen um den Abstand zwischen den Mittelpunkten zu erkennen? Einfach die eine Koordinate minus die andere Koordinate`?
Zuletzt geändert von fragezeichen123 am Donnerstag 7. April 2016, 21:02, insgesamt 1-mal geändert.
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Ich denke Bälle wurden hier nicht zufällig gewählt.

Wenn du die Mittelpunkte der Bälle betrachtest kannst du die Strecke zwischen diesen berechnen. Jetzt musst du dir nur noch überlegen welcher Wert der Bälle, zusammen addiert, unterschritten werden muss damit eine Kollision vorliegt.

*edit*
Du musst die Mittelpunkte kennen x1-x2 und y1-y2 bilden und Pythagoras anwenden. Oder wo liegt dein Problem?

*edit2*
So viele neue Beiträge in der Zwischenzeit, da kann ich ja meinen Beitrag gleich wieder löschen ...
fragezeichen123
User
Beiträge: 18
Registriert: Donnerstag 7. April 2016, 19:32

Erstmal danke Euch allen für die Antworten... werde das ganze morgen mal versuchen... bin einfach zu müde gerade und brauche frische Gedanken (oder wie auch immer man das sagt :) )
Benutzeravatar
bwbg
User
Beiträge: 407
Registriert: Mittwoch 23. Januar 2008, 13:35

Tipp 1: Beschäftige Dich mit Vektorrechnung. Sie ist einfacher, als sie sich anhört und bringt das meiste mit, was Du abbilden willst.

Tipp2: Spiele sind Illusion. Sprich: Es muss nur so aussehen, als ob ...
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"
fragezeichen123
User
Beiträge: 18
Registriert: Donnerstag 7. April 2016, 19:32

Ok... aber wieso muss ich den Satz des Pythagoras anwenden? Das verstehe ich nicht ganz...
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

@fragezeichen123: wie willst Du sonst den Abstand zweier Punkte berechnen?
fragezeichen123
User
Beiträge: 18
Registriert: Donnerstag 7. April 2016, 19:32

Muss ich das so eingeben?


math.sqrt(Zufallszahl1X**2 - xKoordinateNeu**2) > (RadiusZufallsball + RadiusBall) and math.sqrt((Zufallszahl1Y)**2 - (yKoordinateNeu)**2 ) > (RadiusZufallsball + RadiusBall)
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

@fragezeichen123: das kannst Du doch einfach testen. Setz einfach den einen Ball auf die Koordinaten (0,0) und den anderen auf (2,2) jeweils mit Radius 1 und einmal auf (10,10) und (10,12). Bei welchem Fall sollten sie sich berühren und welche nicht.

Wie lautet nochmal Pythagoras?
BlackJack

@fragezeichen123: Wie soll denn die grafische Umsetzung gemacht werden? Oder muss die Kollisionserkennung davon unabhängig sein? Denn einige grafischen Rahmenwerke bringen da selbst schon etwas mit. Pygame beispielsweise, aber auch bei Tk kann man auf fertige Tests zurückgreifen.

Bei den Namen in Deinen Pseudocode-Beispielen solltest Du mal einen Blick in den Style Guide for Python Code werfen wie das mit der konventionellen Namensschreibweise bei Python so aussieht. Bevor Du dann tatsächlich Python-Quelltext schreibst.
BlackJack

Ist ein bisschen OT, aber ich habe die Problemstellung mal zum Vorwand genommen um mich mit dem HTML5-<canvas>-Element zu beschäftigen: http://blog.marc.rintsch.de/2016/04/16/ ... anvas.html :-)
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

BlackJack hat geschrieben:Ist ein bisschen OT, aber ich habe die Problemstellung mal zum Vorwand genommen um mich mit dem HTML5-<canvas>-Element zu beschäftigen: http://blog.marc.rintsch.de/2016/04/16/ ... anvas.html :-)
Jetzt noch nach jedem 'Level' bewegende Elemente einfügen, die man nicht berühren darf und du hast ein altes Flashgame, welches wir in der Schule für Monate gespielt haben.
the more they change the more they stay the same
fragezeichen123
User
Beiträge: 18
Registriert: Donnerstag 7. April 2016, 19:32

Danke... habe das Problem inzwischen gelöst. Das mit der Schreibweise haben wir so in meiner Schule gelernt (mein Lehrer hat das selber so geschrieben).
BlackJack

@fragezeichen123: Das mit der Schreibweise solltest Du trotzdem sorgfältiger machen, denn selbst wenn man sich an einen anderen Stil hält, weil der Lehrer sich nicht auf Python einlassen will und Angewohnheiten von Pascal oder Java einfach so übernimmt, sollte man doch wenigstens konsistent sein und nicht willkürlich mal mit Gross- und mal mit Kleinbuchstaben anfangen oder Teile des Namens aus keinem ersichtlichen Grund komplett gross schreiben.

Vielleicht kennt Dein Lehrer den Style Guide auch gar nicht. Dann könntest Du ihn mal darauf aufmerksam machen.
Antworten