Surface: powierzchnia do obrazowania i ramki
Ekran — to Surface, można tworzyć inne Surface w pamięci, a potem nakładać je na siebie przez blit().
screendostajesz od
pygame.display.set_mode()jest obiektem typu
pygame.Surface: Prostokątny obszar pikseli, na którym możesz
rysuj. Ekran nie jest jedynym Surface w grze: możesz tworzyć dodatkowe
wypływa w pamięci i pracuje z nimi w ten sam sposób.
# Dodatkowa powierzchnia 100x100, oddzielna od ekranu
sprajt = pygame.Surface((100, 100))
sprajt.fill((255, 100, 100))
# Nakładamy (blit) zawartość sprajt na ekran w punkcie (50, 50)
screen.blit(sprajt, (50, 50))
blit() — główna operacja kompozycji w Pygame: „narysować zawartość jednej Surface na innej w wybranym punkcie”. Załadowany obraz
(pygame.image.load(), sekcja 20.19) — to też Surface, i na ekran trafia tym samym wywołaniem blit().
Przezroczystość
Surface mają dwa różne sposoby ustalania przejrzystości. Pierwszy to colorkey:
jeden konkretny kolor jest deklarowany jako „przezroczysty” per-pixel alpha: y
każdy piksel ma własny stopień przezroczystości, co daje miękkie, przezroczyste krawędzie, ale wymaga
obrazy w formacie alfa (zwykle PNG) i powierzchniach tworzonych flagą
pygame.SRCALPHA.
screen.fill(...) na początku klatki, nowe renderowanie po prostu nakłada się na poprzednie — poruszający się obiekt pozostawia za sobą ślad starych pozycji zamiast czystej klatki. Odwrotny błąd — wywołaj fill(), ale zapomnieć pygame.display.flip(): wtedy narysowana ramka pozostanie niewidoczna, a okno pokaże jednolity czarny (lub wcześniej wypełniony) kolor.
pygame.image.load() sam zapisuje kanał alfa przesłanego zdjęcia. Przezroczystość jest naprawdę tracona, jeśli dzwonisz .convert() zamiast .convert_alpha(): .convert() tworzy kopię w formacie pikselowym ekranu, ale bez per-pixel alpha, a krawędzie sprite'a będą rysowane z jednolitym kolorem tła zamiast miękkiego przejścia. Ten sam efekt dotyczy ręcznego utworzenia nowej powierzchni (pygame.Surface(size)) bez flagi pygame.SRCALPHA, gdy potrzebny jest dokładnie per-pixel alpha.