Lekcja 11 - dziedziczenie klas i tworzenie gier (notatki)

Lekcja 11 - dziedziczenie klas i tworzenie gier (notatki)

Dziedziczenie klas

Możemy stworzyć klasy, które dziedziczą atrybuty i metody klasy-rodzica, i dodają własne np.:

class PostacGracza():
  def __init__(self, imie:str, 
    self.imie

  def powitaj

class Wojownik(PostacGracza):
  def __init__(self, imie:str
    super().__init__(imie, hp, mana)
  def paruj_ciosy(self):
    print(f
    

Pozornie to bardzo wygodne rozwiązanie, ale jeśli można, lepiej uniknąć tworzenia takich konstrukcji, ponieważ zmiany w klasie rodziców powodują kaskadowe zmiany w klasach-dzieciach.

Gry w Pythonie

Rzadko tworzy się gry w pythonie, co nie znaczy, że się nie da. Są nawet twórcy, którzy dobrze sobie radzą w tworzeniu takich gier, ceniąc go sobie za szybkość w tworzeniu kodu i przymykając oko na wady (tj. wolne działanie kodu). Do takich twórców należy np. DaFlaffyPotato. W ten sposób tworzy się głównie gry 2d, ale można robić także inne.

Wiele bibliotek dla Pythona nie jest napisane w pythonie (ale w innym języku programowania) mimo to są stworzone tak by móc z nich w Pythonie korzystać. (Podobnie się robi z gierkami.)

Do najbardziej popularnych bibliotek dla Pythona służących do tworzenia gier należy PyGame, ponieważ zapewnia m.in.: wyświetlanie grafiki i jej obsługę (tj. nakładanie, kolizja obiektów), odtwarzanie muzyki i efektów dźwiękowych oraz obsługiwanie joysticków, klawiatur itd. Oczywiście wszystko to można stworzyć samodzielnie, ale jest to duże wyzwanie, dlatego warto skorzystać z gotowca PyGame, lub jej prostszej wersji PyGame Zero.


Do tworzenia bardziej skomplikowanych gierek może posłużyć GODOT - opensourcowy silnik do robienia gier, który ma własny język skryptowy, bardzo podobny do pythona.


PyGame Zero

Zacznijmy od zainstalowania biblioteki poprzez wpisanie w terminalu pip install pygame. Warto też od razu zainstalować stuby, które poinformują edytor kodu, co jest poprawne, a co nie. Jest to przydatne ponieważ wiele rozwiązań zastosowanych w tej bibliotece nie jest dobrze odczytywana np. przez VSCode. By zainstalować stuba wpisujemy w terminal: pip install pgzero-api-stub.

By wykorzystać w aplikacji tę bibliotekę musimy na początku zaimportować ją ("import pgzrun") i stuby ("from pgzero_api_stub import *"), na końcu zaś uruchomić pętlę z programem ("pgzrun.go()"). Pomiędzy znajdzie się nasza właściwa aplikacja, tak jak w przykładzie:

import pgzrun
from pgzero_api_stub import *

#Następnie wstawiamy aplikację
WIDTH = 800
HEIGHT = 600

def draw():
  screen.clear()
  screen.draw.circle((400, 300), 30, "white")

pgzrun.go()

Jest kilka predefiniowanych funkcji w PyGame tj. draw() - rysowanie obiektów czy update() - jeśli stan obiektów się zmienia w trakcie gry i musimy go aktualizować. Ten ostatni tworzy właściwie serię następujących po sobie obrazków, które się pojawiają na ekranie (a zatem porusza obiekt), dzięki temu też niektóre obrazy będą reagować na działanie użytkownika.

import pgzrun
from pgzero_api_stub import *

WIDTH = 800
HEIGHT = 600

def draw():
  screen.clear()
  screen.draw.text("hello world", (300, 100), fontsize=32)

pgzrun.go()

Program wyświetli "hello world".

W jaki sposób umiejscowić obiekt na ekranie? Musimy podać koordynaty na stronie. Przyjęło się, że lewy górny róg to pkt. 0,0, potem w zależności od rozdzielczości ekranu np. 2470x1440, nasza współrzędna x (poziom/szerokość ekranu) ma wartości od 0 do 2470, podczas gdy y (pion/wysokość ekranu) od 0 do 1440.

Teraz zastanówmy się jak puścić w ruch nasz obiekt, tak jak to miało miejsce w starych odtwarzaczach dvd. Najwygodniej stworzyć klasę, tak by można go było dowolnie podmieniać lub zastosować wobec kilku obiektów. Do cech wspólnych tej grupy będzie należało położenie na ekranie (a zatem współrzędna x i y), przemieszczanie o daną liczbę pikseli, oraz posiadanie liter:

class FloatingText():
    def__init__(self, wsp_x:int, wsp_y:int, tekst:str) -> None:
      self.x = wsp_x
      self.y = wsp_y
      self.przemieszczanie_x = 3
      self.przemieszczanie_y = 3
      self.tekst = tekst

Ponadto potrzebujemy metody by dany obiekt pojawił się na ekranie:

    def narysuj_tekst(self):
      screen.draw.text(self.tekst, (self.x, slef.y), fontsize=32)

Oraz się poruszał tzn. musimy sprawić by jego współrzędne się zmieniały. Jednak by w pewnym momencie nie "wyleciał" poza ekran, konieczne jest zastosowanie ograniczeń tak by jego współrzędne nie przekroczyły i nie spadły poniżej szerokości i długości ekranu:

    def przesun_tekst(self):
      self.x = self.x + self.przemieszczanie_x
      self.y = self.y + self.przemieszczanie_y

      if self.x > WIDTH or self.x < 1:
        self.przemieszczanie_x = self.przemieszczanie_x * -1
      if self.y > HEIGHT or self.y < 1:
        self.przemieszczanie_y = self.przemieszczanie_y * -1  

Teraz możemy już uruchomić tekst:

moj_obiekt = FloatingText(wsp_x=100, wsp_y=100, tekst="Hello!")
moj_obiekt2 = FloatingText(wsp_x=100, wsp_y=200, tekst="World!")

def draw():
  screen.clear()
  moj_obiekt.narysuj_tekst()
  moj_obiekt2.narysuj_tekst()

def update():
  moj_obiekt.przesun_tekst()
  moj_obiekt2.przesun_tekst()   

By dowiedzieć się więcej o zawartości biblioteki PyGame, dobrze jest zapoznać się z instrukcjami na ich stronie: "Installing PyGame Zero".