Animierte Sprites von ein paar Bilder
Ich habe die Suche nach ein paar gute tutorial zur Erstellung einfacher sprite-animation von paar-Bildern in Python mit Pygame. Ich habe noch nicht das gefunden was ich Suche.
Meine Frage ist einfach: wie macht man einen animierten sprite aus paar Bilder (für ein Beispiel: machen Sie einige Bilder der explosion mit Abmessungen 20x20px eins zu sein, sondern animiert)
Irgendwelche guten Ideen?
- Sie möchten ein spritesheet. Sie können entweder laden von mehreren Bildern, oder eine einzige mit Quelle
Rect
s festgelegt, wenn Sie blit -. Hier ein weiteres Beispiel: pygame.org/wiki/Spritesheet?parent=CookBook
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnten Sie versuchen, ändern Sie Ihre sprite, so dass es-swaps aus seinem Bild für einen anderen eine im
update
. So, wenn das sprite gerendert wird, es werde animiert.Bearbeiten:
Hier ist ein schnelles Beispiel richtete ich mich auf:
Es wird davon ausgegangen, dass Sie zwei Bilder, sogenannte
image1.png
undimage2.png
im selben Ordner der code ist in.self.counter = 0
innen__init__
. Dann, im innerenupdate
erhöhenself.counter
. Wenn es gleich einige hohe Anzahl (vielleicht 99), dann setzen Sie es auf null und Inkrementierenself.index
durch eine. So, die animation wird aktualisiert, nur einmal alle 100 ticks. Ich bin sicher, es gibt bessere Wege, aber dieser Weg ist ziemlich einfach und wird wahrscheinlich für Sie arbeiten.self.image = self.images[math.floor(self.index)]
und erhöhenself.index
von 0,08 oder so.Es gibt zwei Arten von animation: frame-abhängige und zeitabhängige. Beide arbeiten auf ähnliche Weise.
Vor der main-Schleife
index
, das hält den überblick auf den aktuellen index der Bildliste.current_time
odercurrent_frame
Verfolgung der aktuellen Uhrzeit oder des aktuellen Rahmens seit der letzten index umgestellt.animation_time
oderanimation_frames
definieren, wie viele Sekunden oder frames übergeben sollten, vor dem Wechsel Bild.Während die main-loop
current_time
durch die Anzahl der Sekunden, die vergangen ist, seit wir das Letzte mal erhöht, oder Inkrementcurrent_frame
1.current_time >= animation_time
odercurrent_frame >= animation_frame
. Wenn das stimmt weiterhin mit 3-5.current_time = 0
odercurrent_frame = 0
.index = 0
.Ein voll funktionsfähiges Beispiel
, Wenn Sie zu wählen, welchen
Zeitabhängige animation ermöglicht es Ihnen, spielen Sie die animation mit der gleichen Geschwindigkeit, egal wie langsam/schnell die frame-rate ist, oder langsam/schnell Ihr computer ist. Dies ermöglicht Ihrem Programm, um frei ändern Sie die framerate, ohne die animation und es werden auch konsequent sein, selbst wenn der computer nicht mithalten kann mit der framerate. Wenn das Programm hinkt der animation fangen bis zu dem Zustand, den es haben sollte so, wenn keine Verzögerung geschehen war.
Obwohl, kann es passieren, dass die animation Zyklus nicht synchron mit der framerate, so dass die animation Zyklus erscheinen unregelmäßig. Zum Beispiel, sagen, dass wir die frames aktualisieren jeden 0.05 zweite und die animation wechseln-Bild alle 0.075 zweite, dann der Zyklus wäre:
Und so weiter...
Frame-abhängige kann glatter Aussehen, wenn Ihr computer verarbeiten kann, die framerate konstant. Wenn die Verzögerung passiert, es wird pause in seinem aktuellen Zustand und neu starten, wenn die Verzögerung aufhört, wodurch die Verzögerung mehr spürbar. Diese alternative ist etwas einfacher zu implementieren, da brauchen Sie nur zu erhöhen
current_frame
mit 1 auf jedem Aufruf, statt sich mit der delta-Zeit (dt
) und übergeben Sie es an jedem Objekt.Sprites
Ergebnis
pygame.sprite.Sprite
Klasse.clock.tick(FPS) / 1000
ergibt immer 0 (integer). Stattdessen habe ich verwendetdt = clock.tick(FPS) / 1000.0
zu zwingen, floating-point-Nutzung.Sollten Sie alle haben Ihre sprite-Animationen auf einer großen "Leinwand", also für 3 20x20 explosion von sprite-Bildern haben Sie 60x20 Bild. Jetzt können Sie direkt frames laden Sie einen Bereich des Bildes.
Innen Ihre sprite-Klasse, die meisten wahrscheinlich in der update-Methode sollten Sie etwas wie dies (hardcoded für Einfachheit, ich bevorzuge die separate Klasse, die Verantwortung für die Auswahl der richtigen Animations-frame).
self.f = 0
auf__init__
.