Pygame Animationsphasen

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
Foxi300
User
Beiträge: 18
Registriert: Samstag 21. Januar 2012, 10:30

Hallo Leute,

ich mache derzeit ein Spiel in pygame und als Anfänger hätt ich da mal eine Frage. In dem Spiel, kann man einen Menschen steuern (links, rechts). Nun möchte ich, dass wenn man z.B. nach links geht, auch eine entsprechende Animation kommt (Die Person soll eine Laufanimation haben). Die verschiedenen Bilder habe ich schon erstellt (Linker Schritt, rechter Schritt,...). Nun hätte ich es gerne so, dass diese auch entsprechend angezeigt werden.

Wie?

Danke schonmal

Foxi300
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

Zum Thema 2D-Animation wäre das passende Stichwort "Spritesheet".
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Foxi300 hat geschrieben: Wie?
Naja, Du musst halt intern Deinem Sprite-Objekt das jeweils nächste, passende Bild an `sprite.image` binden. Du könntest das mit einer Kombi aus einem Dictionary und `itertools.cycle` regeln:

Code: Alles auswählen

from itertools import cycle

class MySprite(pygame.sprite.Sprite):

    def __init__(self, ...):
        # sollte man natürlich übergeben!
        animations = {
            "right": (image1, image2, ...),
            "left": (image1, image2, ...)
        }
        # wir merken uns die aktuelle Richtung
        self.direction = "right"
        self.animation = init_animation_sequence(self.direction)

    def update(self):
        # hier passiert die "Magie". Dank `itertools.cycle` wird die aktuelle
        # Sequenz wiederholt durchlaufen -> "A B C A B C A ..."
        # ändert sich die Richtung, muss man `self.animation` zunächst
        # ändern, was in `change_direction` passiert.
        self.image = self.animation.next()

    def init_animation_sequence(self):
         return cycle(self.animations[self.directions])

    def change_direction(self, ...):
        # irgend welche Logik, die die Richtung umändert
        self.animation = init_animation_sequence(self.direction)
Der Code ist für Python2.x geschrieben; bei Python3 müsste es `self.animation.__next__()` lauten.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

@Hyperion, wieso nicht:

Code: Alles auswählen

self.image = next(self.animation)
the more they change the more they stay the same
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

@Dav1d: Kann ich nicht begründen, da `next()` in der Tat die bessere Lösung ist :-P
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Foxi300
User
Beiträge: 18
Registriert: Samstag 21. Januar 2012, 10:30

Also danke, Hyperion, aber ich verstehe diesen Text nicht wirklich, ich bin ein erbärmlicher Anfänger in Pygame ;)
Ich denke, ich bräuchte mal ein gutes (wenn möglich deutsches) Tutorial. Kennt jemand eins?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Eigentlich hat mein Beispiel nur marginal etwas mit `pygame` zu tun! Also fehlen Dir eher Grundlagen von Python ;-)

Was genau ist Dir denn daran unklar? Eigentlich steht da ja nicht viel... also: woran liegt 's?

Du hast oben ja geschrieben, dass Du schon ein Spiel hast - und Dir die Animationen fehlen. Insofern solltest Du ja auch schon eine Klasse haben, die von `pygame.sprite.Sprite` erbt; daran kann es folglich nicht liegen. Die `update`-Methode von `Sprite` wird in der Doku beschrieben und ist imho per se erst einmal trivial. Da Bleiben dann eigentlich nur noch `itertools.cycle` und mein Dictionary... beides ist imho ja nun auch nicht schwer zu kapieren.

Ich bin im Moment wirklich ratlos, wound wieso Du meine Code-Skizze nicht verstehst!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten