Pygame poradnik – Gra w Pythonie dla początkujących

Tworzenie gier to fascynująca oraz ciekawa dziedzina. Jednak istotne jest to, że możesz połączyć przyjemne z pożytecznym. Nie tylko stworzysz coś co Cię fascynuje, ale jednocześnie nauczysz się wielu nowych rzeczy, jeśli chodzi o programowanie. W ramach tej dziedziny stworzono różnorodne biblioteki, dzięki którym uda Ci się stworzyć własną grę. Należy jednak zapoznać się z kilkoma pojęciami, które okazują się kluczowe jeśli chodzi o pisanie kodu gier przy użyciu pygame oraz jakiejkolwiek innej biblioteki.

Istotne pojęcia dotyczące gier które warto poznać

Każda z gier posiada punkty wspólne o których warto wiedzieć. Poniższe pojęcia są niezbędne, a przy tym ich znajomość umożliwi Ci znacznie szybsze zrozumienie artykułów na temat tworzenia gier, niezależnie od tego jaki język jest tam używany.

  • Silnik gry – jest to tak naprawdę główny kod, który odpowiada za działanie całej gry. Często wspiera on obsługę różnych zdarzeń jak choćby korzystanie z klawiatury czy myszki. Do tego zazwyczaj zapewnia wyświetlanie grafiki, obsługę dźwięku oraz inne kwestie, które są kluczowe w przypadku gier. Silnik gry może zostać stworzony już wcześniej, a w ramach danej gry jedynie dopisuje się odpowiedni kod, który będzie odpowiadał za poszczególne rzeczy. Jednak tak jak w poniższym artykule można też na własną rękę stworzyć prosty lub bardziej skomplikowany silnik. Duża część popularnych silników posiada swoje edytory graficzne (np Unity), chociaż istnieją silniki których używa się bezpośrednio z powodu kodu.
  • FPS – to w prostych słowach ilość klatek na sekundę, czyli to jak wiele odświeżeń obrazu nastąpi w czasie sekundy. Wbrew pozorom konieczne jest odgórne ustalenie maksymalnej ilości klatek, inaczej gra będzie działała zbyt szybko i granie w nią okaże się niemożliwe, bo w zaledwie kilka sekund gra obsłuży kilkaset lub kilka tysięcy klatek (powtórzeń głównej pętli). Z takim kłopotem borykają się klasyczne gry uruchomione na nowoczesnych sprzętach, ze względu na brak odgórnie ustalonej ilości FPS, bo komputery na które były tworzone miały bardzo małą moc obliczeniową. W późniejszym czasie usprawniono je, dodając właśnie skrypt określający maksymalną ilość FPS. Jednak w obecnie stosowanych silnikach gier oddzielnie renderuje się klatki (obraz), a oddzielnie aktualizowana jest np. fizyka. Przykładowo w Unity wartości (choćby dotyczące fizyki) mnożone są przez deltę-t, czyli przez czas, jaki upłynął od pojawienia się ostatniej klatki. Pozwala to na zachowanie płynności działania gry niezależnie od tego jak wiele klatek zostanie wyświetlonych w określonym przedziale czasu. Celowe ograniczenie ilości klatek może służyć zmniejszeniu tzw. “stutter,” czyli wahań w ilości klatek, oraz zmniejszeniu zużycia energii przez komputer, który może chodzić na mniejszych obrotach.
  • System kolizji – jest to część kodu odpowiadająca za interakcję między postaciami ( w tym postacią gracza), przedmiotami, ścianami czy innymi obiektami w grze. Dzięki temu zatrzyma się ona w konkretnym miejscu bez możliwości przejścia przez ścianę, czy też w przypadku wroga zada on określone obrażenia gdy gracz natknie się na niego.
  • GUI – graficzny interfejs użytkownika. W przypadku gier chodzi o wszelkiego rodzaju obrazy wyświetlane na ekranie, takie jak postać, przeciwnicy, przedmioty, czy także przyciski.
ads banner

Co to jest pygame?

Pygame to specjalna biblioteka w Pythonie, stworzona przez Pete Shinnersa. Służy ona do tworzenia gier lub aplikacji multimedialnych. Korzysta z SDL do wyświetlania grafiki, odtwarzania audio (dźwięku lub muzyki), obsługi myszy oraz klawiatury, czy obsługi czasu. Ogromną zaletą w przypadku Pygame jest multiplatformowość, bo można korzystać z tej biblioteki na wielu systemach jak choćby Linux, Windows czy Mac. Dodatkowo należy zauważyć, że została rozpowszechniona na zasadach licencji LGPL czyli wolnego oprogramowania. Także teraz już wiesz co to jest pygame.

Pygame – Poradnik

W tym poradniku znajdziesz sposób na stworzenie dwóch gier, czyli Memory oraz Snake’a. Zapewne zasady rozgrywki tych klasycznych tytułów są Ci znane, dzięki czemu ich analiza okaże się jeszcze łatwiejsza.

Pygame poradnik
Możesz kojarzyć gry takie jak Civilization IV, Battlefield 2, Mount & Blade, World of Tanks czy The Sims 4 przy których wykorzystano Pygame.

W ramach tego poradnika korzysta się jedynie z biblioteki pygame oraz random. Python jest wygodnym językiem szczególnie do tworzenia gier 2D. Popularne na całym świecie gry w pythonie to między innymi Civilization IV, Battlefield 2, Mount & Blade, World of Tanks czy The Sims 4, choć należy zaznaczyć, że w wymienionych tytułach python odpowiada za różnego rodzaju skrypty dotyczące zdarzeń lub zachowań. Natomiast silniki korzystają zazwyczaj z szybszych języków, takich jak C++. Python to stosunkowo wolny język, dlatego silniki oparte są o inne języki, szczególnie gdy chodzi o gry 3D gdzie istnieje konieczność wykonywania ogromnej ilości operacji w krótkim czasie. Jednak w przypadku tytułów 2D jak najbardziej można korzystać z wygodnego pythona.

Jak zainstalować pygame?

Z początku konieczna jest instalacja biblioteki Pygame, uda Ci się to zrobić w swoim środowisku programistycznym (IDE) z pomocą polecenia:

Pip to instalator, który rekomenduje większość programistów pythona, a przy tym jest domyślnie dołączony do instalatorów. Jeśli jednak posiadasz zbyt nową wersję Pythona, to może wyświetlać się błąd. W takim przypadku zastosuj tę komendę:

Pozwoli ona uwzględnić przedpremierowe wersje pygame. Teraz już wiesz jak zainstalować pygame przy pomocy zaledwie jednej komendy.

Wstęp do gry „Memory”

W przypadku tworzenia jakiejkolwiek gry, kluczowe jest z początku ustalenie założeń, według których ma działać aplikacja. W przypadku memory chodzi o:

  • Ilość kafelków (kart) jest odgórnie ustalona;
  • Kafelki mają stronę ukrytą (identyczny kolor każdej) oraz odkrytą (po dwie pary w danym kolorze);
  • Po naciśnięciu na kafelek jest on odkrywany;
  • Po odkryciu dwóch identycznych kafelków stają się one statyczne i nie reagują na dalsze kliknięcia;
  • Po odkryciu dwóch różnych kafelków są one zakrywane i ponownie można je wybrać;
  • Gra kończy się w momencie dopasowania wszystkich kafelków do siebie.

W ramach kodu gry w pythonie, konieczne jest wstawienie skryptu odpowiadającego za dołączenie do aplikacji biblioteki pygame, jej zainicjowanie oraz stworzenie okna:

Jednak w tym przypadku okno gry pojawia się zaledwie na chwilę i zniknie. Dzieje się tak, bo nie jest podtrzymywane przez pętlę gry. Jednak łatwo temu zaradzimy z pomocą poniższego kodu:

Dodatkowo w momencie gdy zostanie wykryte zdarzenie QUIT, czyli kliknięcie w przycisk X u rogu okna, to zostanie ono wyłączone, dzięki wyjściu z pętli gra. Zmienna event przyjmuje informacje na temat różnorodnych zdarzeń odbieranych przez ekran gry i można je łatwo odczytać poprzez porównanie go z określonym zdarzeniem.

Teraz przeczytasz o komendach, dzięki którym ta prosta gra w pythonie nabierze kolorytu, a następnie zobaczysz jej pełny kod.

Kluczowe okazuje się wykorzystywanie losowości, bo dzięki temu nawet prosta gra w pythonie zapewnia za każdym razem inne wrażenia. Należy w tym przypadku zaimportować bibliotekę random, co zrobisz w poniższy sposób:

Przydatna jest także komenda odpowiadająca za zmianę kolejności elementów konkretnej listy. W argumencie należy wstawić nazwę listy, bez jej indeksów. Specyficzny przypadek to listy wielowymiarowe, gdzie każdą pod-listę trzeba “wymieszać” oddzielnie. Pod spodem znajdziesz oba typy zastosowań:

Z jej pomocą łatwa staje się zmiana odgórnie wpisanych kolorów kafelków w memory. Poniższa gra jest prosta bo obsługuje zaledwie 6 kafelków, jednak można ją śmiało rozszerzyć, dzięki zmianie wartości poszczególnych zmiennych.

Istotne w każdej grze są także kolory, które można przedstawić za pomocą zmiennej obsługującej RGB. Zdołasz ją potem bezpośrednio wstawiać jako argument do funkcji z biblioteki Pygame:

Do rysowania kształtów wykorzystywana jest funkcja pygame.draw.rect, która w ramach swoich argumentów obsługuje (nazwa-okna, kolor-kształtu, (pozycja-x, pozycja-y, szerokość-kształtu, wysokość-kształtu)). To fundament jeśli chodzi o pygame GUI. Poniżej przedstawiono przykład jej zastosowania:

Jednak nic nie zostanie wyświetlone w oknie gry, jeśli nie odświeży się jej obrazu. Do tego służy funkcja pygame.display.update(). Nadpisuje ona wcześniej powstały obraz, dlatego w momencie gdy postać się poruszy, powstałby za nią ślad. Jest to zachowanie analogiczne do rysowania markerem na tablicy bez uprzedniego starcia tego, co było na niej wcześniej.. Dlatego stosowana jest w tym przypadku funkcja win.fill(kolor_RGB), w ramach swojego argumentu przyjmuje ona kolor RGB którym ma zostać zapełniony ekran gry. W ten sposób można wyczyścić cały ekran.

Przydatna okazuje się także możliwość wyświetlania tekstu na ekranie gry. Zdołasz to osiągnąć dzięki poniżej przedstawionym komendom. Funkcja pygame.font.SysFont(„Arial”,24) przyjmuje jako pierwszy argument rodzaj czcionki, natomiast jako drugi jej wielkość.

Następnie konieczne jest także wyrenderowanie danego tekstu, co osiągniesz za pomocą font.render(„Wygrana!”,False,[255,0,0]). W tym przypadku pierwszy argument to tekst, który ma być wyświetlany, drugi to True lub False odpowiadające za wygładzanie krawędzi tekstu, natomiast trzeci określa kolor wyświetlanej czcionki.

Dopiero w ramach nazwa_okna.blit(text,[200,400]) uda Ci się wyświetlić tekst na ekranie. Pierwszy argument to zmienna przechowująca wyrenderowany tekst, a drugi to pozycja x oraz y na ekranie. Pod spodem masz przykład zastosowania tych komend:

Użyteczna okazuje się też tablica asocjacyjna (nazywana także słownikiem), gdzie w konkretnej zmiennej podaje się w ramach wartości najpierw indeks (może to być dowolny łańcuch znaków) oraz wartość po dwukropku. Gdy chce się wywołać konkretne pole tablicy, wystarczy wpisać w nawiasach kwadratowych łatwy do zapamiętania indeks.

Obsługa myszy, która jest kluczowa w ramach gry memory wymaga:

Pierwsza linijka to kod odpowiadający za sprawdzenie czy wciśnięty został klawisz myszki, kluczowy jest tu oczywiście fragment pygame.MOUSEBUTTONDOWN. Z kolei druga linijka przekazuje informacje o pozycji kursora w danym momencie do zmiennych x1 oraz y1 (nazwy są dowolne).

Pygame GUI
Pygame GUI to biblioteka do tworzenia interfejsów graficznych w Pythonie. Ułatwia dodawanie przycisków, okien i pól tekstowych do gier. Działa jako rozszerzenie biblioteki Pygame.

Ciekawy jest również fragment kodu, dzięki któremu zdołasz ustalić czy kliknięto właśnie w kafelek czy też w inne miejsce. Osiągniesz to poprzez:

W ten sposób jedynie sprawdzasz czy pozycja x myszki jest większa od lewej strony kafelka (jego pozycji x) oraz mniejsza od jego prawej strony (pozycja x + jego szerokość). Identycznie w przypadku pozycji y, gdzie sprawdzasz czy jest mniejsza od góry oraz większa od dołu kafelka. To nie taki skomplikowany kod, jednak pozwala łatwo sprawdzić czy nastąpiła kolizja między myszką, a danym obiektem, a podobny kod odpowiada za bardziej skomplikowane sytuacje w grach, na przykład kolizje fizyczne. To szybki sposób na stworzenie różnego rodzaju przycisków, co jest podstawą jeśli chodzi o obsługę pygame GUI.

Pełny kod gry „Memory”

Pod spodem przedstawiono kod gry memory stworzony przy pomocy biblioteki pygame:

Kod – Memory

Wstęp do klasycznej gry „Snake”

Masz już za sobą statyczną grę jaką jest memory. Teraz przyszedł czas na dynamiczną zabawę z pomocą klasycznego snake’a. Warto najpierw określić założenia tej gry:

  • Wąż porusza się po kafelkach o ustalonym wcześniej rozmiarze;
  • Cała plansza składa się z identycznych kafelków;
  • Na planszy w losowym miejscu (dla ułatwienia gry omija się dwa kafelki najbliżej brzegu planszy) pojawia się punkt (owoc) możliwy do zjedzenia przez węża;
  • Wąż rośnie o długość jednego kafelka po zjedzeniu punktu;
  • Gra kończy się w momencie dotknięcia krańca planszy lub swojego ogona przez węża;
  • Ilość punktów jest wyświetlana na ekranie.

Do stworzenia tej gry wykorzystuje się w większości komendy, które udało Ci się poznać wcześniej. Jednak jest tu kilka nowości jeśli chodzi o polecenia pygame oraz ogólne algorytmy.

Przede wszystkim korzysta się w tym przypadku z opcji zegara, który umożliwia ustalenie odgórnej ilości FPS, czyli klatek na sekundę. Jest to możliwe dzięki poniższym komendom:

Pierwsza linijka to stworzenie zegara, który będzie obsługiwał grę. Dopiero z jego pomocą można korzystać z różnych komend, takich jak właśnie tick. W przypadku tego polecenia w argumencie podaje się ile klatek na sekundę może przerobić pętla gry, czyli im większa wartość w argumencie, tym szybciej przebiega gra.

Drugim istotnym rodzajem komend jest tu oczywiście też obsługa klawiszy.

Do zmiennej klawisz zapisywane jest obecne użycie klawiatury. Z kolei w kolejnej linijce dzięki wykorzystaniu zmiennej klawisz podobnie do listy i sprawdzeniu indeksu pygame.K_LEFT można się zorientować czy strzałka w lewo została użyta, bo zostanie wtedy zwrócona wartość True. Analogicznie, jeśli nie użyto tego klawisza, to zwróci się wartość False. Inne klawisze ze strzałkami to:

  • pygame.K_RIGHT,
  • pygame.K_UP,
  • pygame.K_DOWN.

Oprócz opisanych powyżej komend najbardziej istotne w przypadku gry snake, jest sprytne użycie listy jako zbioru elementów z których składa się postać. Jednak najpierw objaśnię w skrócie zasadę poruszania się węża.

Polega ona na ustaleniu kierunku w którym ma się poruszać, w tym przypadku uzyskano to za pomocą listy z dwoma elementami, gdzie pierwszy odpowiada za oś x, natomiast drugi za oś y. W momencie gdy wąż ma poruszać się w górę, to drugi element listy zyskuje wartość -1 (bo im wyżej do góry, tym mniejsza wartość y, jako że x oraz y są liczone od lewego górnego rogu ekranu gry). Z kolei jeśli wąż ma zacząć poruszać się w prawo, to pierwszy element listy zyskuje wartość 1, natomiast drugi jest zerowany.

Następnie w grę wchodzi zmiana obecnej pozycji węża i tu właśnie trzeba zorientować się w jaki sposób wykorzystać zasadę działania listy.

W przypadku tej gry zastosowano listę krotek, czyli listę składającą się ze zbioru krotek składających się z dwóch elementów, gdzie jedna odpowiada za oś x, a druga za oś y.

Krotki to odpowiednik listy (wartości zapisuje się poprzez nawiasy okrągłe, a nie kwadratowe), jednak istotne jest to, że nie można modyfikować zawartych w nich danych. Dlatego w przypadku zwykłych krotek posiadających nawet wiele elementów, nie można dodać nowych wartości. Jednak jeśli krotki umieszczone zostaną w zwykłej liście, można dodawać do tej listy nowe krotki. Jest to użyteczna konstrukcja, która w przypadku gry snake pozwala nie martwić się o przypadkową zmianę danych dotyczących pozycji postaci. Przykład uproszczonej krotki oraz listy krotek, a także przykładowe sposoby na ich wykorzystanie znajdziesz pod spodem:

W momencie gdy wąż rusza się o jeden kafelek w którąś ze stron, to dodawany jest nowy element listy krotek z wartościami z ostatniego elementu powiększonymi o wartość kierunku. Jednocześnie usuwany jest pierwszy element listy. Dzięki temu tworzy się iluzję ruchu, poprzez dodanie nowego elementu oraz usunięcie pierwszego. W ramach kodu wygląda to tak:

Komenda append odpowiada za dodanie nowego elementu listy o wartości przekazywanej w ramach argumentu w nawiasach. Z kolei zapis [1: ] zwraca kopię oryginalnej tablicy, jednak bez pierwszego elementu listy.

Część osób zdziwi się widząc w kodzie indeks listy o wartości -1, jednak nie jest to błąd. Jest to sposób, na wyznaczenie ostatniego elementu listy, niezależnie od tego jak wiele wartości ona posiada. Analogicznie, jeśli wstawi się tam -2 to wybrany zostanie przedostatni element danej listy.

Pełny kod gry „Snake”

Teraz posiadasz już wystarczającą wiedzę, żeby nawet samodzielnie stworzyć grę snake, jednak przeanalizuj poniższy kod stworzony na potrzeby tego tutorialu pygame, a także zastosuj go w praktyce. Z pewnością dzięki temu nauczysz się jeszcze więcej.

Kod – Snake

Wbrew pozorom kody dotyczące snake’a oraz memory są naprawdę proste, zwłaszcza w porównaniu z rozbudowanymi grami. Jak widzisz możesz śmiało samodzielnie zacząć tworzyć grę jaką sobie wymarzysz. Wykorzystaj ten pygame tutorial i stwórz własne gry, które pozwolą Ci na jeszcze większy rozwój.

Zadania dodatkowe

  1. Dodaj większą ilość kafelków do gry memory.
  2. Wstaw do memory oraz snake’a proste klawisze (do klikania myszką) „start”, „reset”, „wyjdź z gry”.
  3. Wstaw obrazki do odkrytych i zakrytych kafelków w grze memory.
  4. Wstaw obraz tła, punktu oraz postaci węża do gry snake.

Spis komend

Pod spodem został umieszczony spis komend objaśnionych wcześniej w ramach tego poradnika pygame, a także kilka dodatkowych, które z pewnością okażą się przydatne:

Lista klawiszy:

Wczytywanie stanu klawiszy:

Wczytywanie stanu myszki i opcje okna:

ads banner