Lekcja 10- OOP w praktyce, PyGame

Lekcja 10- OOP w praktyce, PyGame
Photo by Lisa Keffer / Unsplash

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()