Artykuł na temat biblioteki "pygame" w języku Python! Wyjaśnię w nim jak wygląda rysowanie figur geometrycznych w "pygame", gdyż może sprawiać problemy ze względu na nieintuicyjne działanie 🧠. Tutaj to funkcjonuje inaczej, niż w silnikach gry, dlatego trzeba rozumieć jak to ze sobą współgra. Pokażę Ci też kilka przykładowych metod do rysowania podstawowych figur geometrycznych oraz dlaczego odświeżanie ekranu jest rzeczą, o której nie można zapomnieć ⚠️! Jeżeli nie wiesz na czym polega biblioteka "pygame", przeczytaj artykuł wprowadzający do tematu 👈.

JAK ODBYWA SIĘ RYSOWANIE FIGUR GEOMETRYCZNYCH W "PYGAME"?

Materiał podzieliłem na 3 następujące części:

  1. przedstawienie działania systemu współrzędnych w "pygame",
  2. przedstawienie kilku metod do rysowania kilku figur geometrycznych (nie będzie o importowaniu plików graficznych - ten temat jest w osobnym artykule),
  3. wyjaśnienie znaczenia odświeżania ekranu.

Wszystkie podpunkty stanowią podstawę do pełnego zrozumienia tematu rysowania po ekranie w "pygame". Jeżeli dopiero się uczysz, nie wolno Ci pominąć żadnego z etapów 📖!

1. UKŁAD WSPÓŁRZĘDNYCH

Zanim przejdziemy do samego rysowania, musisz wiedzieć jak w "pygame" działa układ współrzędnych 📐. Każde narzędzie do tworzenia gier określa w różny sposób ustawianie współrzędnych wszystkich obiektów od tzw. punktu początkowego (ang. origin). Na przykład w silniku "Unity", za wysokość odpowiada oś Y, lecz w programie "Blender" (do modelowania 3D), to już oś Z reprezentuje wysokość (tak samo jest w "Unreal Engine"). Dlatego zwracam na to uwagę 💣.

W "pygame", "liczenie" współrzędnych zawsze zaczyna się od lewego górnego rogu ℹ️. Także idąc według osi X, kierujemy się w prawo, a według osi Y, idziemy w dół 👍.

Punkt początkowy układu współrzędnych w "pygame"

W "pygame", punkt początkowy (ang. origin) znajduje się w lewym górnym rogu. W osi odciętych (X), poruszamy się w prawo, a w osi rzędnych (Y), poruszamy się w dół.

2. PRZYKŁADOWE METODY DO RYSOWANIA FIGUR GEOMETRYCZNYCH

Teraz popatrzmy na parę metod, które pozwalają na rysowanie figur geometrycznych w "pygame" 🎨. Wszystkie metody, o jakich wspominam, pochodzą z modułu "draw". To nie są wszystkie jakie występują w "pygame" - resztę możesz znaleźć w oficjalnej dokumentacji.

Metody wykonujące cokolwiek, co ma związek z grą, najlepiej umieszczać po sprawdzeniu instrukcją warunkową, że jest sens dalej wykonywać pętlę gry 🔁. Pokażę w kodzie źródłowym 👇:

import pygame

window = pygame.display.set_mode([320, 240])
is_running = True

while is_running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            is_running = False

    # instrukcje dot. rysowania w oknie gry
    pygame.display.update()

pygame.quit()

W miejscu, w którym dałem komentarz ✅. Dobrą praktyką jest też zdefiniowanie sobie metod dzieląc na:

  • obsługę sterowania 🎮,
  • aktualizację 🔁,
  • rysowanie 🎨.

i wstawienie wywołań w tej samej kolejności tam, gdzie jest komentarz, natomiast tutaj skupiamy się na zupełnie innym temacie 😉. Koniecznie umieść wywołanie metody "update", zaraz po metodach rysujących - szczegóły zostawiam w ostatniej części materiału 📰!

rect

"rect" to jest rysowanie prostokąta. Metoda oczekuje 3 parametrów:

  • zmienną przechowującą okno gry,
  • listę z trzema liczbami całkowitymi oznaczającymi wartości zgodne z paletą barw RGB (czerwony, zielony, niebieski) w zakresie <0-255>,
  • instancję obiektu typu "pygame.Rect" przyjmującą za parametry kolejno: pozycję w osi X, pozycję w osi Y, szerokość oraz wysokość.

Tak wygląda prosty przykład 👇:

pygame.draw.rect(window, [200, 150, 100], pygame.Rect(16, 16, 48, 72))

Oto efekt końcowy:

Rysowanie prostokąta przy użyciu metody "rect" w "pygame"

Przykładowy efekt wywołania metody "pygame.draw.rect".

circle

Rysowanie koła odbywa się poprzez metod o nazwie "circle". Przyjmuje ona 4 parametry:

  • zmienną referencyjną okna gry,
  • listę trzech tych samych wartości RGB,
  • listę dwóch wartości dla określenia pozycji środka koła w przestrzeni 2D (x, y),
  • średnicę w pikselach jakie to koło ma przyjmować.

Oto przykład wywołania 👇:

pygame.draw.circle(window, [30, 100, 60], [48, 48], 32)

Uzyskujemy takie kółko 😄:

Rysowanie koła przy użyciu metody "circle" w "pygame"

Przykładowy efekt wywołania metody "pygame.draw.circle".

polygon

Trzecią z prezentowanych metod jest "polygon" przeznaczoną do rysowania wielokątów. Czyli możemy nie tylko nanosić na ekran trójkąty, lecz również sześciokąty, ośmiokąty, osiemnastokąty itd. 🌟!!! Wbrew pozorom, korzystanie z niej wcale nie jest skomplikowane (trzeba tylko uważać na nawiasy 🙂)!

"polygon" składa się z 3 następujących parametrów:

  • zmienna przechowująca nasze okienko z grą,
  • ta sama lista wartości RGB,
  • lista list zawierających po 2 wartości dla ustalenia pozycji w przestrzeni 2D każdego z podanych wierzchołków (powtarzam - lista list 🤯!).

Proszę bardzo, przykład 👇:

pygame.draw.polygon(window, [128, 255, 75], [[16, 16], [25, 44], [102, 73]])

i to nam da taki trójkącik 🙂:

Rysowanie trójkąta przy użyciu metody "polygon" w "pygame"

Przykładowy efekt wywołania metody "pygame.draw.polygon".

Można dostać oczopląsu od tego ostatniego parametru 😅, natomiast jak nabierzesz wprawy, to będziesz tak pisać automatycznie ⏩.

Jeszcze jedna rzecz dotycząca wszystkiego, co jest rysowane. Możesz bez problemu "nakładać" jeden element na drugi i wtedy "schowany" będzie ten, którego wywołanie odbyło się wcześniej od drugiego. W takich narzędziach, jak "pygame", kolejność wywołań poszczególnych elementów działa jak warstwy "idące w stronę kamery". Innymi słowy, na wierzchu będzie ten element, który będzie rysowany najpóźniej ℹ️.

3. ODŚWIEŻANIE EKRANU

Ostatnia ważna część - odświeżanie. "pygame" działa dość nietypowo w odróżnieniu od potężniejszych narzędzi, w których po prostu kładzie się obiekt na scenie i "z dyńki" 😁. Dlatego na samym wstępie zaznaczyłem, żebyś dorzucił(a) metodę "update", ponieważ bez niej...nie zobaczysz niczego na ekranie 🔥!!!

Aby prawidłowo zaprogramować rysowanie figur geometrycznych, musisz jeszcze wstawić wywołanie metody odpowiedzialnej za aktualizowanie (odświeżanie) ekranu 🧹. To działa tak, gdybyś przeniósł/przeniosła do innego katalogu jakiś plik i ujrzał(a) go tam dopiero po naciśnięciu przycisku "Odśwież" z menu kontekstowego, a nie automatycznie ℹ️.

Masz do tego dwie metody 👇:

  • "update" (odświeżanie całego ekranu bądź tylko pewnego fragmentu - tylko jak się wprowadzi wartość typu "pygame.Rect" do parametru albo listę takich instancji),
  • "flip" (odświeżanie całego ekranu).

Obie znajdują się w module "display". NIGDY nie wstawiaj obu naraz! Wybieraj tylko jedną z dwóch zależnie od okoliczności!


W ten sposób dotarliśmy do końca i wyjaśniłem Ci jak wygląda rysowanie figur geometrycznych w "pygame" 😊!