Obsah poznámek psaných kurzívou si nemusíte pamatovat. Obdobné poznámky budou součástí písemky, a stejně tak komentáře v druhé části.

Procvičování: vlastní třídy

Následující tři příklady jsou recyklované z minulého cvičení na písemku, která nebyla.

Příklad. Vyrobte vlastní třídu, pro jejíž instance (to znamená, objekty jejího typu) vždy platí x == y.
Porovnávání má na starosti funkce se speciálním názvem __eq__(self, druhy_porovnavany_objekt).

Řešení.
class VzdyckySeRovna:
  def __eq__(self, other):
    return True

# a na ukázku:
>>> a = VzdyckySeRovna()
>>> b = VzdyckySeRovna()
>>> a == b
True

Příklad. Vyrobte vlastní třídu: bod v rovině. Má mít dvě vlastnosti, a to souřadnice x, y, a ty bude potřeba zadat jako parametry při vytváření objektů téhle třídy.
Konstruktor (funkce na vytváření nových objektů) má speciální název __init__. První parametr musí být samozřejmě self, další můžou být, jaké chcete.

Řešení.
class Bod:
  def __init__(self, x, y):
    self.x = x
    self.y = y

Příklad. Doplňte třídu z předchozího příkladu tak, aby rozdíl dvou bodů v rovině byl zase bod v rovině, se souřadnicemi c.x = a.x - b.x, c.y = a.y - b.y, v případě že bod c vzniknul voláním c = a - b.
Funkce na odčítání má speciální název __sub__(self, objekt_ktery_se_odecita).

Řešení.
class Bod:
  def __init__(self, x, y):
    self.x = x
    self.y = y
  def __sub__(self, other):
    return Bod(self.x - other.x, self.y - other.y)

# a na ukázku:
>>> a = Bod(2,3)
>>> b = Bod(1,-1)
>>> c = a - b
>>> c.x, c.y
(1, 4)

Pygame

Poznámky z hodiny (ještě je během pondělka doplním).

Příklad. Následující program nakreslí kolečko a potom použije několik kopírovacích operací blit. Kolik koleček bude vidět na obrazovce po skončení kódu?
Je-li cilova_plocha objekt typu pygame.Surface, pak funkce cilova_plocha.blit(zdrojova_plocha, cilova_pozice) nakreslí obrázek zdrojova_plocha do obrázku cilova_plocha, tak, aby se levý horní roh zdrojového obrázku nakreslil na pozici cilova_pozice v cílovém obrázku. Funkce může přijímat ještě další parametry, které ale nebudeme potřebovat. Vždy se přirozeně kreslí jen ta část, která se do cílového obrázku vejde (například při kreslení většího obrázku do menšího).
Funkce pygame.draw.circle(cilova_plocha, barva, pozice_stredu, polomer) vykreslí kolečko. Všimněte si, že udáváme střed a poloměr kruhu (a ne například levý horní roh a průměr).

# nutne formality na zacatek
import pygame
pygame.init()
# vyrobime okno velikosti 200 x 200 pixelu
screen = pygame.display.set_mode((200, 200))
cervena = pygame.Color(255, 0, 0)
# vyrobime plochu velikosti 100 x 100 pixelu, ktera ale neni videt
kolecko = pygame.Surface((100, 100))
# vykreslime kolecko cervenou barvou pres celou mensi plochu
pygame.draw.circle(kolecko, cervena, (50, 50), 50)
# nasledujici ctyri operace jsou to, cim byste si meli lamat hlavu
screen.blit(kolecko, (100, 0))
screen.blit(kolecko, (100, 0))
kolecko.blit(screen, (0, 0))
screen.blit(kolecko, (0, 0))
# poprosime pygame, aby plochu screen opravdu ukazal uzivateli
pygame.display.update()
# vterinu pockame a pak zavreme okno (nehledejte tady chytak)
pygame.time.wait(1000)
pygame.quit()
Řešení zjistíte sami, když kód spustíte.

Příklad. Napište program využívající Pygame, který na obrazovku nakreslí následující obrázek:
červená kolečka nakreslená různě přes sebe
Šířka obrázku je 200 pixelů. Obrázek nestahujte na disk, kód ho musí nakreslit sám od sebe. Začněte z kódu předchozího příkladu a jenom ho upravte.

Řešení.
# nutne formality na zacatek
import pygame
pygame.init()
# vyrobime okno velikosti 200 x 200 pixelu
screen = pygame.display.set_mode((200, 200))
cervena = pygame.Color(255, 0, 0)
# vyrobime plochu velikosti 100 x 100 pixelu, ktera ale neni videt
kolecko = pygame.Surface((100, 100))
# vykreslime kolecko cervenou barvou pres celou mensi plochu
pygame.draw.circle(kolecko, cervena, (50, 50), 50)
# kolecko nakreslime ctyrikrat ruzne posunute, takze samo sebe prekryje
screen.blit(kolecko, (0, 0))
screen.blit(kolecko, (0, 50))
screen.blit(kolecko, (50, 0))
screen.blit(kolecko, (50, 50))
# poprosime pygame, aby plochu screen opravdu ukazal uzivateli
pygame.display.update()
# vterinu pockame a pak zavreme okno
pygame.time.wait(1000)
pygame.quit()