Dvanáctý sraz - matice


Iveta Česalová

Po počátečním zmatku, kdy si Petr zapomněl svůj počítač, jsme poslední sraz roku zahájily opět rekapitulací, co kdo dělal. Doposud byla hra rozdělena na čtyři moduly – backend, frontend, game a testy. Nyní je v backendu pouze třída Robot, State a funkce pro načtení souřadnic, cesty k robotům, počtu políček a počáteční stav hry.

V repozitáři přibylo několik souborů. Loading.py obsahuje funkce, které kompletně načtou mapu se všemi potřebnými komponenty a vlastnostmi a soubor Util.py zase třídy Tile a Direction. Soubor Validator.py kontroluje, zda je mapa správně vytvořena.

Kouzelné podtržítko

Pokud chceme, aby někdo ve zbytku kódu nepoužíval konkrétní proměnnou (slovník, seznam...), dáme před ni podtržítko, jako např u _board. Značí věci, které jsou pro nějakou třídu interní a ten, kdo nemá dobrý důvod pracovat s vnitřnostmi určité třídy, měl by použít něco jiného. Podtržítkem říkám – vyhrazuji si právo cokoli změnit.

class State:
    def __init__(self, board, robots, sizes):
        self._board = board
        self.robots = robots
        self.sizes = sizes

Nekombinovat více knihoven

Není dobré v kódu kombinovat více knihoven, když lze použít jen jednu :-) Konkrétně v souboru export_img.py, který nám automaticky převádí soubory SVG do PNG formátu jsou použity knihovny os a subprocess, tvorba adresáře příkazem os.mkdir() lze nahradit Path.mkdir() a není potřeba importovat os.

Matice

Velkým tématem srazu byly MATICE. Řešíme totiž problém ohledně změny velikosti obrazovky a aby se mapa správně měnila. Matice je schéma čísel či matematických objektů, používají se na transformaci grafiky.

Druhy transformace: posun, zvětšení, rotace, zkosení, zrcadlení.

Maticové násobení – transformace se zkombinují.

Máme obrázek o souřadnicích x, y a vynásobím je maticí, která reprezentuje posun či jinou transformaci. „z“ bude vždy 1. Petr nám to vysvětloval na dvou čtvercích, skládajících se z koleček. Bílá kolečka jsou původní, modrá transformované pomocí matice. Matici můžu v kódu jednoduše měnit. Jednoduchý návod k nalezení zde.

Původní matice a výpis bílých koleček:

bile

Transformace

transformace

Pyglet a knihovna OpenGL, aneb jak nastavit transformační matici pro celou scénu.

Pomocí funkce pyglet.gl.glPushMatrix() řeknu – zapamatuj si počáteční stav. Naopak na konci pyglet.gl.glPopMatrix() vrátí do původního stavu. Mezitím můžu upravovat transformační matici dle potřeby.

Mezi základnější funkce patří:

pyglet.gl.glTranslatef() – posun

pyglet.gl.glRotate() – rotace

pyglet.gl.glScale() - změna měřítka

gl

A jak vyřešit potřebnou změnu velikosti obrazovky? Pomocí pyglet.gl.glScalef()

@window.event
def on_draw():
    window.clear()
    pyglet.gl.glPushMatrix()
    zoom = min(
        window.height/200,
        window.width/200
    )
    pyglet.gl.glScalef(zoom, zoom, 1)

    for x in range(0, 200, 20):
        for y in range(0, 200, 20):
            z = 1
            sprite.x = x
            sprite.y = y
            sprite.draw()
zoom

Na začátku kurzu jsme plánovaly jeho trvání do konce prosince, ovšem bylo to přehnaně optimistické. V dalším roce nás bude o něco méně a pravděpodobně se nebudeme scházet každý týden, takže nečekejte pravidelný blog :-)