Menu
CoddyTech

Ein Sprite Sheet zuschneiden

Teil des Abschnitts Sprites und Bilder der Pygame-Journey von Coddy. Lektion 25 von 36.

Eine Animation besteht aus mehreren Bildern, die nacheinander gezeigt werden. Spiele speichern diese Bilder oft in einer Datei, einem Sprite-Sheet: einem Raster aus kleinen, nebeneinander angeordneten Einzelbildern. Das Starterprojekt zeichnet assets/sheets/platformer_characters.png vollständig, mit 9 Einzelbildern in der Breite und 3 in der Höhe, jedes 24 mal 24 Pixel groß. Die beiden Gehposen der grünen Figur sind die ersten beiden in der oberen Reihe.

sheet.subsurface(rect) gibt dir den Teil des Sheets innerhalb eines Rect als eigenständige Surface zurück, ohne ein Pixel zu kopieren. Einzelbild Nummer col in Zeile row beginnt bei (col * 24, row * 24):

frames = []
for col in (0, 1):
    frame = sheet.subsurface((col * 24, 0, 24, 24))
    frames.append(pygame.transform.scale_by(frame, 3))

24 Pixel sind auf einem 640 mal 480 großen Fenster winzig, daher wird jedes Einzelbild auf 72 mal 72 skaliert. Pixelgrafiken behalten bei einer Skalierung um eine ganze Zahl ihre scharfen Kanten. Schneide die Einzelbilder aus und skaliere sie einmal vor der Schleife, und speichere sie in einer Liste: In den nächsten Lektionen wird anhand des Indexes eines davon ausgewählt.

challenge icon

Aufgabe

Mittel
  1. Erstelle vor der Schleife frames: die Frames in den Spalten 0 und 1 der obersten Zeile, jeweils 24 × 24 groß und um den Faktor 3 skaliert.
  2. Zeichne statt des gesamten Sheets frames[0] bei (200, 200) und frames[1] bei (368, 200).

Probier es selbst

import pygame

pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("Sprite Sheet")
clock = pygame.time.Clock()

sheet = pygame.image.load("assets/sheets/platformer_characters.png").convert_alpha()

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    screen.fill((20, 22, 40))
    screen.blit(sheet, (212, 204))
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

Alle Lektionen in Sprites und Bilder

Übe selbstständig: Pygame-Playground