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
Pygame Animationsphasen
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
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:Foxi300 hat geschrieben: Wie?
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)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
@Hyperion, wieso nicht:
Code: Alles auswählen
self.image = next(self.animation)
the more they change the more they stay the same
- 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 

encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
- 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!

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
assert encoding_kapiert