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
"Kollision" von zwei Bällen erkennen
-
- 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.
Grund: Quelltext in Code-Tags gesetzt.
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.
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.
@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.
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.
-
- 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.
- 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 ...
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 ...
-
- 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 )
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 ...
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!"
-
- 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...
-
- 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)
math.sqrt(Zufallszahl1X**2 - xKoordinateNeu**2) > (RadiusZufallsball + RadiusBall) and math.sqrt((Zufallszahl1Y)**2 - (yKoordinateNeu)**2 ) > (RadiusZufallsball + RadiusBall)
@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?
Wie lautet nochmal Pythagoras?
@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.
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.
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.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
the more they change the more they stay the same
-
- 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).
@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.
Vielleicht kennt Dein Lehrer den Style Guide auch gar nicht. Dann könntest Du ihn mal darauf aufmerksam machen.