Rozdział 20 · Tworzenie gier z Pygame

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.

sozdanie_surface.py
# 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))
Rzeczywiste okno: różowy kwadrat 100×100 naniesiony na ciemnoniebieskie tło w punkcie (50, 50)
Okno rzeczywiste: Wynik screen.blit(sprajt, (50, 50)) - Drugi Surface wylosowany dokładnie w wyznaczonym punkcie.

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.

Rzeczywiste okno: półprzezroczysta czerwona warstwa nad czarnym tłem wygląda na ciemno-bordową, a nie na czystą czerwień
Real Window: per-pixel alpha w akcji – ostateczny kolor to mieszanka tła i przezroczystej warstwy, a nie czysty kolor warstwy.
Ekran nie jest zalany – są „ślady”
Jeśli pominąć 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.
Prawdziwe okno: Łańcuch czerwonych kółek pozostaje na ekranie, ponieważ tło między ujęciami nigdy nie zostało ponownie zalane
Rzeczywiste okno: celowo odtworzony błąd „zapomniano screen.fill()” — każdy nowy okrąg pozostaje nad poprzednimi.
Przezroczystość „zniknęła” po konwersji obrazu
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.
Praktyka: Surface, blit i przejrzystość
Pygame otwiera natywne okno Python – uruchomione lokalnie w VS Code, PyCharm lub Jupyter
Praktyka kursuje lokalnie
Otwórz praktykę →