Pygame Sprite Collision

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
DKKA
User
Beiträge: 45
Registriert: Freitag 18. Oktober 2013, 14:20

Hallo,

Die "Collide"-Methoden vergleichen ja die beiden Rects der Sprites. Leider habe ich vertikale Wände deren Winkel ich jedoch mit "Pygame.transform.rotate" verändere, so dass sie beispielsweise im 45° Winkel stehen. Doch leider funktionieren nun die "Collide"-Methoden nicht mehr. Gibt es eine Möglichkeit die Collision zu nützen so dass sie sich auf das Image und nicht auf das Rect bezieht?

Und noch eine zweite Frage. So wie ich es verstanden habe, sollte man nie alles neu zeichnen sondern nur das, was sich gerade geändert hat. Heisst das, wenn ich eine Figur an Position (50,50) habe und sie nach (60,50) verschiebe, dann muss ich an der Stelle (50,50) ein neues Rects mit dem Hintergrund zeichnen, oder geht das irgendwie simpler wenn die Sprites sich in einer Gruppe befinden?

Vielen Dank.
Zuletzt geändert von DKKA am Mittwoch 29. Januar 2014, 10:51, insgesamt 1-mal geändert.
Benutzeravatar
Don Polettone
User
Beiträge: 115
Registriert: Dienstag 23. November 2010, 20:26
Wohnort: Schweiz

Hi DKKA,

In den meisten Fällen ist es noch weit genug performant, einfach jedes Frame den Bildschirm schwarz auszumalen (oder den ganzen Hintergrund darüber zu blitten, wenn genug gross) und alle Objekte dann wieder draufpappen.

Ich mach es seit jeher so - wenn Du keinen 2 86er zuhause hast sollte das easy ausreichen :D Oder hast Du enorm viele Objekte zu blitten? Mehr als 100 oder so?
Ich code, also bin ich.
DKKA
User
Beiträge: 45
Registriert: Freitag 18. Oktober 2013, 14:20

Henry Jones Jr. hat geschrieben:Hi DKKA,

In den meisten Fällen ist es noch weit genug performant, einfach jedes Frame den Bildschirm schwarz auszumalen (oder den ganzen Hintergrund darüber zu blitten, wenn genug gross) und alle Objekte dann wieder draufpappen.

Ich mach es seit jeher so - wenn Du keinen 2 86er zuhause hast sollte das easy ausreichen :D Oder hast Du enorm viele Objekte zu blitten? Mehr als 100 oder so?
Ich habe einen animierten Sternenhintergrund und auch wenn es bei mir flüssig läuft, wenn ich alles neu zeichne, so ist das trotzdem nicht die saubere Lösung.
Benutzeravatar
Don Polettone
User
Beiträge: 115
Registriert: Dienstag 23. November 2010, 20:26
Wohnort: Schweiz

Wenn Dir das widerstrebt jedes Frame alles neu zu blitten oder Du befürchtest, dass es so Probleme geben wird, dann ist Dein Ansatz der richtige, ja :)
Ich code, also bin ich.
Benutzeravatar
Don Polettone
User
Beiträge: 115
Registriert: Dienstag 23. November 2010, 20:26
Wohnort: Schweiz

und bzgl. rect Kollision: Wenn Du ein Bild drehst, ändert sich das Rect (Grösse) - dann funzt auch die Rect Kollision so nicht mehr... ist eben schon komplexer dann; Du müsstest Polygon Kollisionsabfragen haben / machen ODER den Sprites ein immer gleichleibendes Rect (z.Bsp. self.hit_rect) oder so mitgeben (ich weiss nicht genau was Du machen willst und wie "genau" die Abfrage sein muss...?). Hast Du einen Printscreen von Deinem Machwerk oder eine Erklärung was genau es tun soll?
Ich code, also bin ich.
DKKA
User
Beiträge: 45
Registriert: Freitag 18. Oktober 2013, 14:20

Henry Jones Jr. hat geschrieben:und bzgl. rect Kollision: Wenn Du ein Bild drehst, ändert sich das Rect (Grösse) - dann funzt auch die Rect Kollision so nicht mehr... ist eben schon komplexer dann; Du müsstest Polygon Kollisionsabfragen haben / machen ODER den Sprites ein immer gleichleibendes Rect (z.Bsp. self.hit_rect) oder so mitgeben (ich weiss nicht genau was Du machen willst und wie "genau" die Abfrage sein muss...?). Hast Du einen Printscreen von Deinem Machwerk oder eine Erklärung was genau es tun soll?
Hier eine Skizze:

Bild

Links ist die Wand ungedreht und rechts gedreht. Und eben, ich weiss, dass sich das Rect vergrössert, ich suche nur eine andere Kollisionsmethode die sich nicht auf das Rect bezieht. Ich kann einem Bild auch kein gleichbleibendes Rect mitgeben weil die Kollision je nach Winkel früher oder später erfolgt. Es wäre toll, wenn es eine art "collide_image" gäbte, die das Bild vergleicht und nicht das Rect. Weil es mir nach viel arbeit aussieht das umzuprogrammieren.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

DKKA hat geschrieben:Ich habe einen animierten Sternenhintergrund und auch wenn es bei mir flüssig läuft, wenn ich alles neu zeichne, so ist das trotzdem nicht die saubere Lösung.
Die komplette Szene neu zu zeichnen ist das Standardvorgehen. Das nicht zu tun ist unüblich.
Das Leben ist wie ein Tennisball.
DKKA
User
Beiträge: 45
Registriert: Freitag 18. Oktober 2013, 14:20

EyDu hat geschrieben:
DKKA hat geschrieben:Ich habe einen animierten Sternenhintergrund und auch wenn es bei mir flüssig läuft, wenn ich alles neu zeichne, so ist das trotzdem nicht die saubere Lösung.
Die komplette Szene neu zu zeichnen ist das Standardvorgehen. Das nicht zu tun ist unüblich.
Da steht aber was anderes auf der Pygame Homepage: http://www.pygame.org/docs/tut/newbieguide.html Stichwort: Dirty rect animation.
Benutzeravatar
bwbg
User
Beiträge: 407
Registriert: Mittwoch 23. Januar 2008, 13:35

Bei SDL (und damit pygame) ist das vollständige Neuzeichnen leider nicht die übliche Vorgehensweise. Hier zeichnet man die Bereiche neu, welche sich verändert haben. pygame.display.update nimmt daher eine Liste mit Rect-Objekten entgegen.

Dein Kollisionsproblem löst Du am besten getrennt von der Darstellung (Stichwort: SAT / Seperating Axis Theorem).
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"
Benutzeravatar
Don Polettone
User
Beiträge: 115
Registriert: Dienstag 23. November 2010, 20:26
Wohnort: Schweiz

...hmm... habe mir gerade noch überlegt, wenn ich die Skizze so sehe...: Gibt das eine Art "Pong" mit schrägen Wänden oder was genau soll denn an den Wänden abprallen / kollidieren? Wenn es einfach eine pos ist (also z.Bsp. ein Ball / Schuss, der sich auf einen Punkt reduzieren liesse kollisionstechnisch), dann wäre ja Eintrittswinkel = Austrittswinkel (ist Dir ja aber wohl klar denke ich...).

Wie genau soll das ausschauen? Je nach dem bieten sich auch verschiedene und evtl. recht einfache Wege an, dass zu proggen. Was soll da wie kollidieren?
Ich code, also bin ich.
Erkenbrand
User
Beiträge: 15
Registriert: Sonntag 12. September 2010, 17:18

Hi

Man kann auch eine pixelgenaue Kollision mit pygame per Maske machen
http://www.pygame.org/docs/ref/sprite.h ... llide_mask
Antworten