2026-08-03 10:24:17 +02:00
|
|
|
|
# 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/` | 3–4 | 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 (5–15 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 3–4): <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ć.
|