python-arcade-oo/README.md

88 lines
5 KiB
Markdown
Raw Normal View History

# OOP w Pythonie przez bibliotekę arcade — kurs 5-dniowy
Kurs dla osoby, która dobrze zna proceduralnego Pythona (pętle, funkcje, listy,
słowniki, algorytmy), ale nie pisała jeszcze klas. Przez pięć dni budujemy gry
w bibliotece [arcade](https://api.arcade.academy/) i przy okazji poznajemy
obiektowość: klasy, konstruktory, dziedziczenie, nadpisywanie metod, `property`.
Uwaga: kurs korzysta z **arcade 3.x** (zweryfikowano na 3.3.3). API 3.x różni się
od starych tutoriali z wersji 2.x — patrz sekcja „Pułapki API” na dole.
## Setup
```bash
# 1. Wirtualne środowisko (w katalogu projektu)
python3 -m venv .venv
# 2. Aktywacja
source .venv/bin/activate # Linux / macOS
# .venv\Scripts\activate # Windows (PowerShell / cmd)
# 3. Instalacja zależności
pip install -r requirements.txt
# 4. Sprawdzenie, czy działa
python -c "import arcade; print(arcade.VERSION)"
python dzien1/01_okno.py
```
Jeśli po `python dzien1/01_okno.py` otworzy się okno z napisem — środowisko jest
gotowe. Zamykamy okno krzyżykiem albo `Esc` (tam, gdzie jest obsłużony).
## Plan dni
| Katalog | Dzień | Temat | Co ćwiczymy z OOP |
| ------------------------ | ----- | ------------------------------------------------- | ------------------------------------------------------------ |
| `dzien1/` | 1 | Pierwsze okno, rysowanie, ruch sprite'a | klasa, `__init__`, `super()`, dziedziczenie po `arcade.Window`, nadpisywanie metod |
| `dzien2/` | 2 | Zbieranie monet + własna hierarchia wrogów | klasa bazowa i klasy pochodne, nadpisywanie `update()`, polimorfizm |
| `dzien3_4_platformowka/` | 34 | Platformówka wg oficjalnego tutoriala | kompozycja obiektów (silnik fizyki, kamera, sceny), `property` z walidacją |
| `dzien5_projekt/` | 5 | Własna gra od zera | projektowanie klas, podział na pliki, `arcade.View` jako stany gry |
| `assets/` | — | Grafika i dźwięki (do pobrania samodzielnie) | — |
## Zasady pracy
1. **Uzupełniaj `TODO`.** Każdy plik startowy *działa* od razu — uruchom go
najpierw bez zmian, zobacz co robi, dopiero potem szukaj `TODO:` i dopisuj kod.
2. **Uruchamiaj często.** Po każdej małej zmianie (515 linii) odpal program.
Łatwiej znaleźć błąd w pięciu nowych liniach niż w stu.
3. **Commit po każdym działającym kroku.** Nie po każdym dniu — po każdym
momencie, w którym gra znowu się uruchamia:
```bash
git add -A
git commit -m "dzien2: klasa Enemy odbija się od krawędzi"
```
Dzięki temu zawsze można wrócić do ostatniej wersji, która działała.
4. **Czytaj komunikaty błędów od dołu.** Ostatnia linia traceback mówi *co* się
stało, linie wyżej mówią *gdzie*.
5. **Nie kopiuj kodu, którego nie rozumiesz.** Jeśli coś w przykładzie jest
niejasne — zmień to i zobacz, co się zepsuje. To najszybszy sposób nauki.
## Materiały
- Primer (szybkie wprowadzenie do arcade): <https://realpython.com/arcade-python-game-framework/>
- Kurs „Learn Arcade” (długi, po angielsku, z zadaniami): <https://learn.arcade.academy/>
- Tutorial platformówki (podstawa dni 34): <https://api.arcade.academy/en/latest/tutorials/platform_tutorial/index.html>
- Przykłady kodu (kopalnia gotowych rozwiązań): <https://api.arcade.academy/en/latest/example_code/index.html>
- Darmowe assety (grafika, dźwięki): <https://kenney.nl/assets>
## Pułapki API — arcade 3.x kontra stare tutoriale
Duża część poradników w internecie opisuje arcade 2.x. Najczęstsze różnice:
| Stare (2.x) | Aktualne (3.x) |
| -------------------------------------- | ----------------------------------------------------------- |
| `arcade.start_render()` w `on_draw` | `self.clear()` |
| `sprite_list.on_update(delta_time)` | `sprite_list.update(delta_time)``SpriteList` **nie ma** `on_update` |
| `def update(self):` w klasie sprite'a | `def update(self, delta_time=1/60, *args, **kwargs):` |
| `arcade.draw_rectangle_filled(...)` | `arcade.draw_lrbt_rectangle_filled(...)` lub `draw_lbwh_rectangle_filled(...)` |
| `arcade.set_background_color(...)` | `self.background_color = ...` (atrybut okna / widoku) |
| `arcade.Camera(...)` | `arcade.Camera2D(...)` |
Jeżeli tutorial nie działa — najpierw sprawdź tę tabelę, potem oficjalną
dokumentację dla 3.x.
Ostrzeżenie `PerformanceWarning: draw_text is an extremely slow function`
pojawia się normalnie i **nie jest błędem** — arcade sugeruje, żeby przy wielu
napisach tworzyć obiekty `arcade.Text` raz w `__init__` i tylko je rysować.
Przy kilku napisach na ekranie można je zignorować.