Lekcja 10- OOP w praktyce, PyGame
Kanał YT z grami napisanymi w Pythonie: DaFluffyPotato
Z pomocą do tworzenia gier w Pythonie przychodzi nam biblioteka PyGame. Co nam daje ta biblioteka?
- możliwość wyświetlania grafiki i jej obsługa
- odtwarzanie muzyki i efektów dźwiękowycg
- wykrywanie kolizji
- uruchamianie pętli,
- obsługa urządzeń we/wy (klawiatura, mysz itd.)
PyGame Zero jest zbudowane na bibliotece PyGame, ale upraszcza ją, dba o uruchamianie właściwej pętli z programem.
Jak ją zainstalować? W terminalu wpisujemy pip install pgzero
Jak importujemy bibliotekę do programu i czym kończymy program?
import pgzrun #import biblioteki PyGame Zero
pgzrun.go() #uruchamia właściwą pętlę gry, musi być w programie
Niezbędne nam funkcje i klasy do napisania gry pong:
draw() - rysowanie obiektów
update() - wywołujemy wszystkie rzeczy, których stan będzie się zmieniał
Actor - klasa - obiekty które wchodzą w interakcję z graczem (u nas paletka, piłka)
metoda screen.draw.text do wyświetlenia tekstu na ekranie
VSCode może wyświetlać nam komunikaty o błędach, które nie są błędami w grze, możemy je zignorować lub zaimportować stuby:
from pgzero_api_stub import * # można doimportować, żeby nie wyskakiwały błędy
STAŁE w Pythonie piszemy z dużych liter (savoir-vivre ;)), np.:
WIDTH = 600 #stałe zapisujemy z dużej litery
HEIGHT = 600 #stałe zapisujemy z dużej litery
obrazki bez tła pobieramy w formacie .png
Nasz program z zajęć z grą ping-pong:
from pgzero.builtins import *
import pgzrun
# Waszym zadaniem jest stworzenie klas do ponizszych obiektów
class Paletka(Actor):
def __init__(self, obrazek, polozenie):
Actor.__init__(self, obrazek, polozenie)
self.obrazek = obrazek
self.polozenie = polozenie
def gora(self):
if self.top > 5:
self.y -= 8
def dol(self):
if self.bottom < HEIGHT - 5:
self.y += 8
class Pilka(Actor):
def __init__(self, obrazek, polozenie) -> None:
Actor.__init__(self, obrazek, polozenie)
self.velx = 5
self.vely = 5
def ruch(self):
self.x += self.velx
self.y += self.vely
if self.x > WIDTH:
self.velx *= -1
if self.x < 0:
self.velx *= -1
if self.y > HEIGHT:
self.vely *= -1
if self.y < 0:
self.vely *= -1
if pilka.colliderect(paletka_gracz1) or pilka.colliderect(paletka_gracz2):
self.velx *= -1
class TablicaPunktow:
def __init__(self) -> None:
self.gracz1_pkt = 0
self.gracz2_pkt = 0
def dodaj_punkty(self):
if pilka.x < 0:
self.gracz2_pkt += 1
if pilka.x > WIDTH:
self.gracz1_pkt += 1
screen.draw.text(f"{self.gracz1_pkt}:{self.gracz2_pkt}", (380, 10), fontsize=32)
def dzwieki():
# pass
if pilka.colliderect(paletka_gracz1) or pilka.colliderect(paletka_gracz2):
sounds.hit_paletka.play()
if pilka.x < 0:
sounds.hit_sciana.play()
if pilka.x > WIDTH:
sounds.hit_sciana.play()
if pilka.y < 0:
sounds.hit_sciana.play()
if pilka.y > HEIGHT:
sounds.hit_sciana.play()
def sterowanie():
if keyboard.w:
paletka_gracz1.gora()
if keyboard.s:
paletka_gracz1.dol()
if keyboard.UP:
paletka_gracz2.gora()
if keyboard.DOWN:
paletka_gracz2.dol()
# stworzenie zmiennych i obiektów
WIDTH = 800
HEIGHT = 600
paletka_gracz1 = Paletka("paletka", (10, HEIGHT / 2))
paletka_gracz2 = Paletka("paletka", (WIDTH - 10, HEIGHT / 2))
pilka = Pilka("pilka", (WIDTH / 2, HEIGHT / 2))
tablica = TablicaPunktow()
velx = 5
vely = 5
def draw():
screen.fill((0, 0, 0))
paletka_gracz1.draw()
paletka_gracz2.draw()
tablica.dodaj_punkty()
pilka.draw()
def update():
sterowanie()
dzwieki()
pilka.ruch()
pgzrun.go()