Erweiterte Sprite-Collusion

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
lowbob
User
Beiträge: 2
Registriert: Mittwoch 9. Juni 2010, 13:35

Ich hab habe einen kleinen Zombie-Shooter programmiert der zwar funktioniert, aber nicht ganz so, wie ich will:

Wenn eine Sprite-Kollesion zwischen dem kugel-sprite und dem zombie-sprite stattfindet, soll der zombie nicht einfach gekillet werden, sonder seine bewegung unterbrochen und das zombie-bild mit einem blutfleck ersetzt werden.

Beide Sprites sind als Gruppe definiert und ich nutze den Befehl "pygame.sprite.groupcollide(shots, zombies, 1, 0)".
Wenn ich den zombie in in der funktion kille, wird verschwindet der getroffene, wenn in aber nicht kille und die bewegung und das bild änderen will, wird ein zufälliger zombie gestoppt und dessem bild ersetzt.

Code: Alles auswählen

class zombie(pygame.sprite.Sprite):
    def __init__(self, spawn_punkt):
        pygame.sprite.Sprite.__init__(self)
        self.image=pygame.image.load("zombie.png").convert_alpha()
        self.rect = self.image.get_rect()
        self.rect.topleft = spawn_punkt
        self.move= True



    def update(self):
        if pygame.sprite.groupcollide(shots, zombies, 1, 0):
            self.move=False
            self.image=pygame.image.load("tot3.png").convert_alpha()
            
            
        if self.move:
            self.rect.move_ip((0, 2))
        else:
             self.rect.move_ip((0, 0))
            
        if self.rect.bottom == 550:
            self.kill()
            global leben
            leben=leben-5

Würde mich über Vorschläge freuen :)
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Ich kenn mich nicht wirklich mit PyGame aus, aber im allgemeinen solltest du das in Zwei schritten machen.
Schritt 1: Alle kollisionen erkennen und alle getroffenen Zombies als Tot *markieren*
Schritt 2: Tote Zombies entfernen und neue Sprites für Blutflecken erstellen.

PS: Der Code sieht ziemlich schlimm aus. Sieh dir mal PEP8 an was die Formatierung angeht und beschäftige dich etwas mit Software Architektur und Best Practices. Lass die Zombies Sprites sein und verschiebe die Logik für das abziehen von Leben und lösen von Kollisionen wo anders hin.
[url=http://29a.ch/]My Website - 29a.ch[/url]
"If privacy is outlawed, only outlaws will have privacy." - Phil Zimmermann
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Natürlich kommt es ganz auf die Art des Spiels an, ich würde bei pygame meist aber ein Tile-basiertes Datenmodell bevorzugen und diese ganzen Kollisionsprobleme weg von den Sprites verlagern. Evtl. löst das bereits Deine Problematik.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
lowbob
User
Beiträge: 2
Registriert: Mittwoch 9. Juni 2010, 13:35

Hyperion hat geschrieben:Natürlich kommt es ganz auf die Art des Spiels an, ich würde bei pygame meist aber ein Tile-basiertes Datenmodell bevorzugen und diese ganzen Kollisionsprobleme weg von den Sprites verlagern. Evtl. löst das bereits Deine Problematik.
Danke, das war tatsächlich die Lösung für mein Problem!
Eigentlich hatte ich das vorher auch schon so, jetzt hab ich die kollesions-abfrage aber nach dem updaten der zombie-gruppe gesetzt und jetzt funktioniert es so wie ich es haben wollte.

veers hat geschrieben:Ich kenn mich nicht wirklich mit PyGame aus, aber im allgemeinen solltest du das in Zwei schritten machen.
Schritt 1: Alle kollisionen erkennen und alle getroffenen Zombies als Tot *markieren*
Schritt 2: Tote Zombies entfernen und neue Sprites für Blutflecken erstellen.

PS: Der Code sieht ziemlich schlimm aus. Sieh dir mal PEP8 an was die Formatierung angeht und beschäftige dich etwas mit Software Architektur und Best Practices. Lass die Zombies Sprites sein und verschiebe die Logik für das abziehen von Leben und lösen von Kollisionen wo anders hin.
Ich weiß, ich weiß, der Code sieht wirklich nicht gut aus.
Das Spiel ist als Schul-Projekt gedacht, das letzte mal, dass ich mit python gearbeitet habe ist zwei Jahre her und ich will nicht den ganzen Code in 4 Tagen umschreiben. :oops:

Danke euch beiden! :)
Antworten