Menu
CoddyTech

Przytnij arkusz sprite’ów

Część sekcji Sprite’y i obrazy ścieżki Pygame w Coddy. Lekcja 25 z 36.

Animacja to kilka obrazków wyświetlanych jeden po drugim. Gry często przechowują te obrazki w jednym pliku, arkuszu sprite’ów: siatce małych klatek ułożonych obok siebie. Kod startowy rysuje cały plik assets/sheets/platformer_characters.png: 9 klatek w poziomie i 3 w pionie, każda o wymiarach 24 na 24 piksele. Dwie pozy zielonej postaci podczas chodzenia to dwie pierwsze klatki w górnym rzędzie.

sheet.subsurface(rect) zwraca część arkusza znajdującą się wewnątrz obiektu Rect jako osobny obiekt Surface, bez kopiowania żadnego piksela. Klatka o numerze col w wierszu row zaczyna się w punkcie (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 piksele to niewiele w oknie o wymiarach 640 na 480, dlatego każda klatka jest powiększana 3 razy do rozmiaru 72 na 72. Grafika pikselowa powiększona o całkowitą wartość zachowuje ostre krawędzie. Wytnij i powiększ klatki raz, przed pętlą, a następnie umieść je na liście: w kolejnych lekcjach wybierzesz klatkę według jej indeksu.

challenge icon

Wyzwanie

Średni
  1. Przed pętlą utwórz frames: klatki w kolumnach 0 i 1 górnego wiersza, każda o wymiarach 24 na 24, przeskalowane 3 razy.
  2. Zamiast całego arkusza narysuj frames[0] w (200, 200) i frames[1] w (368, 200).

Spróbuj swoich sił

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()

Wszystkie lekcje w sekcji Sprite’y i obrazy

Poćwicz samodzielnie: Edytor online Pygame