Lekcja 10 - Nikola Horn

Gra w "chomika" - z resetującą się "piłeczką" po uderzeniu w ścianę
from pgzero_api_stub import *
from pgzero.builtins import *
import pgzrun
# Waszym zadaniem jest stworzenie klas do ponizszych obiektów
class Paletka(Actor):
def __init__ (self, obrazek: str, 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.x=380
self.y=380
if self.x < 0:
self.x=380
self.y=380
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.5:
self.gracz2_pkt += 1
if pilka.x > WIDTH-0.5:
self.gracz1_pkt += 1
screen.draw.text((f"{self.gracz1_pkt} | {self.gracz2_pkt}"), (380,10), color=(251, 206, 177), fontsize=40, owidth=0.5, ocolor=(255,255,255))
def dzwieki():
#pass
if pilka.colliderect(paletka_gracz1) or pilka.colliderect(paletka_gracz2):
sounds.hamha.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("chomic", (40, HEIGHT / 2))
paletka_gracz2 = Paletka("chomib", (WIDTH - 40, HEIGHT / 2))
pilka = Pilka("pestka", (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()
"Wygaszacz ekranu" z dwoma ruszającymi się elementami, które "odbijają się" od siebie
from pgzero_api_stub import *
from pgzero.builtins import *
import pgzrun
WIDTH = 800
HEIGHT = 600
class Chomik(Actor):
def __init__(self, obrazek, polozenie) -> None:
Actor.__init__(self, obrazek, polozenie)
self.velx = 5
self.vely = 5
self.obrazek = obrazek
self.polozenie = polozenie
self.x = 0
self.y = 0
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
class Pestka(Actor):
def __init__(self, obrazek, polozenie) -> None:
Actor.__init__(self, obrazek, polozenie)
self.velx = 5
self.vely = 5
self.obrazek = obrazek
self.polozenie = polozenie
self.x = 0
self.y = 0
def ruch(self):
self.x += self.velx
self.y += self.vely
if self.x > WIDTH:
self.velx *= -1.001
if self.x < 0:
self.velx *= -1.001
if self.y > HEIGHT:
self.vely *= -1.001
if self.y < 0:
self.vely *= -1.001
if pilka1.colliderect(pilka2):
self.velx *= -1
pilka1 = Chomik("chomik", (WIDTH / 2, HEIGHT / 2))
pilka2 = Pestka("pestka",(WIDTH / 8, HEIGHT / 8))
def draw():
screen.clear()
pilka1.draw()
pilka2.draw()
def update():
pilka1.ruch()
pilka2.ruch()
pgzrun.go()
Notatki z zajęć
Dziedziczenie klas nie jest najlepszym pomysłem w programowaniu obiektowym, bo bardzo łatwo jest wtedy "zepsuć" kod, kiedy różne osoby pracują nad różnymi klasami w tym samym czasie.
Lepiej jest jak klasa posiada obiekt typu jakiejś klasy:
class Profesja:
#tutaj szczegóły klasy profesja
class PostacGracza:
def __init__ (self, imie: str, profesja: Profesja)
self.profesja = Profesja
Biblioteka PyGame Zero
Welcome to Pygame Zero — Pygame Zero 1.2.1 documentation

PyGame Zero buduje na innej bibliotece - PyGame. Upraszcza ją jednak trochę, np. dba o uruchamianie właściwej pętli z programem.
pip install pgzero
import pgzrun
WIDTH = 800
HEIGHT = 600
pgzrun.go()
Niezbędne funkcje i klasy:
draw() - odpowiada za rysowanie obiektów
update()
klasa Actor
metoda .draw.text z screen - służy do obsługi tekstu w grze