Lekcja 10 - Nikola Horn

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