Rozdział 20 · Tworzenie gier z Pygame

Sprite'y, obrazy i zasoby gry

Gotowe obrazy są ładowane na jednej linii — ale ścieżka do nich powinna być liczona od lokalizacji kodu, a nie od miejsca jego uruchomienia.

Kształty rysowane pygame.draw, świetnie do Ale prawdziwe gry prawie zawsze wykorzystują gotowe obrazy — zasoby. Są ładowane w jednej linii:

zagruzka_izobrazheniya.py
igrok_kartinka = pygame.image.load("assets/igrok.png").convert_alpha()
screen.blit(igrok_kartinka, (x, y))

pygame.image.load() już całkowicie ładuje obraz — .convert_alpha() po tym, jak technicznie nie jest to konieczne, ale dla obrazy z przezroczystością, zdecydowanie zaleca się wywołanie go natychmiast po inicjalizacji ekran: tworzy kopię obrazu w formacie pikselowym optymalnym do ponownego rysowania na tym ekranie i zapisuje per-pixel alpha (Rozdział 20.17). Bez niego Obraz z przezroczystością zwykle nadal działa, ale można go wyraźnie wyrenderować wolniejsze przy częstych połączeniach blit().

„Sprite”
W tym rozdziale sprite oznacza po prostu obraz obiektu gry: ładujemy go i rysujemy blit(). Pygame ma również klasę o tej samej nazwie pygame.sprite.Sprite z grupami pygame.sprite.Group, które mogą aktualizować i sprawdzać kolizje dla wielu obiektów jednocześnie, ale tutaj nie są potrzebne, a wrócimy do nich w rozdziale 21, gdzie zauważalny wzrost liczby obiektów.

Skąd gra wie, gdzie są pliki

Ścieżka "assets/igrok.png"względny: to liczy się od bieżącego katalogu roboczego procesu (CWD), a nie od lokalizacji samego pliku z kodem. Dopóki uruchamiasz grę z tego samego folderu, w którym leży kod, różnicy nie widać — ale warto uruchomić ją z innego miejsca (na przykład przez skrót lub przez python папка/igra.py z sąsiedniego katalogu), oraz ładowania Spadki z FileNotFoundError. Niezawodne rozwiązanie – moduł pathlib (Rozdział 15): buduj ścieżkę od lokalizacji samego pliku za pomocą Kod, a nie na podstawie miejsca, z którego został wystrzelony.

nadezhnyj_put.py
from pathlib import Path

BASE_DIR = Path(__file__).resolve().parent
igrok_kartinka = pygame.image.load(BASE_DIR / "assets" / "igrok.png").convert_alpha()
Droga do zasobu zależy od aktualnego katalogu startowego
"Wszystko działa dla mnie" i "FileNotFoundError na innym komputerze" to klasyczny objaw względnej ścieżki zbudowanej bez Path(__file__). Szczególnie łatwo to przeoczyć przy pakowaniu do pliku wykonywalnego (rozdział 20.29), gdzie katalog roboczy procesu może w ogóle nie zgadzać się z folderem, z którego uruchomiono plik wykonywalny.

Organizacja folderu projektu

Dobrze ugruntowaną konwencją jest utrzymywanie kodu i zasobów oddzielnie, grupując zasoby według typu:

struktura_proekta.txt
moya_igra/
  igra.py
  assets/
    images/
      igrok.png
      vrag.png
    sounds/
      prygok.wav
Praktyka: ładowanie sprite’ów i niezawodne ścieżki
Pygame otwiera natywne okno Python – uruchomione lokalnie w VS Code, PyCharm lub Jupyter
Praktyka kursuje lokalnie
Otwórz praktykę →