Rozdział 20 · Tworzenie gier z Pygame

Jak działa pętla gry: wejście, aktualizacja i renderowanie

Podstawowym modelem pętli gry w tej książce są trzy powtarzalne fazy: proces wprowadzania, stan aktualizacji, rysowanie klatki.

W sekcji 20.2 już napisałeś pętlę gry — ale teraz, znając kontekst całego rozdziału, powinieneś Nazywaj jego części dokładnymi nazwami. W naszych Pygame- gier używamy podstawowego modelu: dowolnych Cykl w tej książce, od najprostszej piłki do końcowego projektu, składa się z trzech powtarzalnych fazy.

Input
pygame.event.get()
pygame.key.get_pressed()
Update
zmienić współrzędne
sprawdzić kolizje
zaktualizować swoje konto
Render
screen.fill(...)
narysować wszystkich bohaterów
pygame.display.flip()
i znowu od początku – dziesiątki razy na sekundę
Czekać do następnej klatki
clock.tick(FPS)
Input → Update → Render jest podstawowym modelem, na którym opierają się wszystkie projekty w tym rozdziale.

Kolejność faz jest ważna: wprowadzanie jest przetwarzane wcześniej niż aktualizacja stanu (w przeciwnym razie postać reaguje na klawisz z opóźnieniem jednej klatki), a aktualizacja — wcześniej niż rysowanie (w przeciwnym razie na ekranie pojawi się stara, jeszcze nie zaktualizowana klatka). W rozdziale 20.26 te trzy fazy staną się trzema metodami klasy Game.

Duże silniki mają bardziej złożony schemat
Input → Update → Render solidna podstawa dla projektów edukacyjnych i małych, ale nie jedyny możliwy schemat. Duże silniki gier często stosują stały krok fizyczny oddzielny od liczby klatek na ekran, kilka różnych faz odświeżania (np. logikę i animację osobno), interpolację między klatkami dla płynniejszego obrazu, kolejki zdarzeń priorytetowych oraz czasem wiele wątków wykonania. Te komplikacje są tu celowo zbędne — trzy fazy wystarczą, by zrozumieć zasadę, a bardziej złożone schematy można wrócić później, gdy projekt naprawdę tego wymaga.
Zapomniałem pygame.init()
pygame.init() nie jest jedynym sposobem na inicjalizację Pygame—możesz inicjować potrzebne moduły pojedynczo—ale w projektach w tej książce zawsze zaczynamy od niego: to wygodny sposób na inicjalizację wszystkich modułów, które wymagają inicjalizacji jednocześnie. Jeśli go pominiesz, niektóre moduły (głównie audio) nie będą gotowe, a komunikaty o błędach czasem wskazują na złe miejsce pygame.init(), ale na zupełnie innej linii — gdzie najpierw potrzebował Pygame nieinicjalizowanego modułu.
Kolejka zdarzeń nie jest przetwarzana – okno „zawiesza się”
System operacyjny uznaje okno za zawieszone, jeśli nie zajmuje mu dużo czasu pobranie zdarzeń z kolejki — pygame.event.get() powinien być wywoływany w każdej klatce, nawet jeśli wewnątrz pętli for event in ... nic nie robisz w większości zdarzeń. Przegapienie tego połączenia na kilka sekund to częsty powód oznaczenia „Nie odpowiada”
Praktyka: trzy fazy cyklu gry
Pygame otwiera natywne okno Python – uruchomione lokalnie w VS Code, PyCharm lub Jupyter
Praktyka kursuje lokalnie
Otwórz praktykę →