Rozdział 20 · Tworzenie gier z Pygame
Jak debugować gry
Kompendium według objawu: większość błędów Pygame-projektów nie powoduje wyjątek — gra po prostu zachowuje się nie tak, jak oczekiwano.
W trakcie rozdziału natknąłeś się już na ponad tuzin typowych błędów Pygame-projects. jeden lub dwa dla każdego nowego tematu. Tutaj są zebrane w jednej tabeli – jako książka referencyjna, co jest wygodne do powrotu, gdy coś w swoim projekcie zachowuje się niewytłumaczalnie.
| Objaw | Zwykła przyczyna | Gdzie dowiedzieć się więcej |
|---|---|---|
| Okno oznaczone jako „Nie odpowiada” | pygame.event.get() nie jest nazywana w każdej klatce | 20.14 |
| Pygame moduły od początku nie działają prawidłowo | Zapomniane pygame.init() | 20.14 |
| Procesor obciążony w 100% bez powodu | Zapomniano clock.tick(FPS) | 20.15 |
| Postać teleportuje się na cały ekran | dt nie przelicza się z milisekund na sekundy | 20.16 |
| Ukośnie szybciej niż prosta | Wektor prędkości nie jest znormalizowany | 20.16 |
| „Ślady” | Zapomniane screen.fill() na początku kadłu | 20.17 |
| Okno pokazuje tylko ekran | Zapomniano pygame.display.flip() | 20.17 |
| Przezroczystość obrazu zniknęła | Przywołany przez . convert() zamiast . convert_alpha(), czyli Surface stworzony bez pygame.SRCALPHA | 20.17 |
| FileNotFoundError na cudzym komputerze | Droga do aktywa nie jest budowana przez pathlib | 20.19 |
| Postać drga zamiast płynnie | KEYDOWN stosowane do działania ciągłego | 20.20 |
| Seria ognia z broni wybucha jednym stuknięciem | get_pressed() używane do jednorazowej akcji | 20.20 |
| Zderzenia wydają się niesprawiedliwe | Hitbox nie jest zredukowany z obrazu | 20.21 |
| Animacja wizualnie opóźnia się o jedną klatkę | Aktualizacja klatki animacji następuje po rysowaniu | 20.23 |
| Zauważalne spowolnienia przy każdym dźwięku | Sound() jest odtwarzana w każdej klatce, a nie raz | 20.24 |
| Gra „teleportuje się” po zdjęciu pauzy | Pauza jest sprawdzana tylko w render(), nie w update() | 20.26 |
Ogólna metoda debugowania gier
Prawie wszystkie robaki z tej tabeli mają jedną wspólną cechę: nie porzucają wyjątek i nie porzucają Pokazuj tradycyjny komunikat o błędzie – gra po prostu nie działa zgodnie z oczekiwaniami. Dla tej klasy błędów szczególnie przydatne są następujące elementy:
otladka_pechatyu.py
#Temporary print() najszybszy sposób, by zobaczyć rzeczywiste wartości
print(f"dt={{dt:.4f}} x={{x:.1f}} skorost_x={{skorost_x:.1f}}")
# Tymczasowo renderuj hitbox na szczycie sprite'a — zobacz jego granice oczami
pygame.draw.rect(screen, (255, 0, 0), hitbox, width=2)
Debugowanie rysowania — nie zapomnij usunąć
Tymczasowe
pygame.draw.rect(..., width=2) hitboxa to jeden z najskuteczniejszych trików debugowania kolizji, ale łatwo o nim zapomnieć w gotowym projekcie. Przydatnym nawykiem jest trzymanie takich insertów pod jednym wspólnym flagiem, jak OTLADKA = Falsewłączać i wyłączać je jednocześnie, zamiast przeglądać cały plik.Praktyka: diagnoza na podstawie objawu
Zeskanowanie bezpośrednio w przeglądarce – nie wymaga instalacji Pygame