Pygamen käsitteitä

Surface (pinta)

Pygamen surface on keskeinen konsepti, joka edustaa kuvaa tai piirtoalustaa, johon voidaan piirtää. Se toimii kuin kangas taiteilijalle: voit piirtää sille erilaisia kuvioita, tekstiä, ladata kuvatiedostoja tai yhdistellä useampia surface-objekteja luodaksesi monimutkaisempia graafisia esityksiä. Surface voi edustaa myös pelinäkymää kokonaisuudessaan tai sen osaa, esimerkiksi taustaa tai hahmoa. 

Jokainen surface-objekti sisältää pikseleitä, ja sen koko määritellään luomisvaiheessa leveytenä ja korkeutena pikseleinä. Voit manipuloida näitä pikseleitä suoraan tai käyttää Pygamen tarjoamia funktioita piirto-operaatioihin, kuten viivojen, ellipsien, neliöiden piirtämiseen tai kuvien piirtämiseen surface-objektin päälle.

pinta = pygame.Surface((100,50))
​luo pinta nimisen surfacen jossa 100 on leveys ja 50 korkeus. Näin luotu surface on tyhjä ja sen oletusväri on musta

Myös Pygamen ikkuna (näyttö) on surface. Se poikkeaa muista pinnoista olemalla hierarkiassa kaikkia muita surfaceja ylemäpänä, ikäänkuin kaikkien pintojen "äiti". Kun haluamme muut surfacet näkyviin, kopioimme ne .blit -metodilla tähän päänäyttöön.

Päänäkymän luonti:
näyttö = pygame.display.set_mode((LEVEYS, KORKEUS))
Aiemmin luodun pinta -nimisen surfacen kopiointi (eli blittaaminen) näytölle:
näyttö.blit(pinta, (0,0))
​Blit-metodin parametreistä pinta edustaa lähdettä, eli sitä mikä surface näytölle kopioidaan ja tuple (0,0) kertoo mihin koordinaattehin pinnan vasen yläkulma näytöllä sijoitetaan. Suorien koordinaatien sijaan voidaan antaa myös Rect-objekti, joka mahdollistaa helpomman ja monipuolisemman sijoittelun.


Rect-objekti

Pygamen rect-objekti edustaa suorakulmion muotoista aluetta. Se on erittäin hyödyllinen, kun työskennellään graafisten elementtien, kuvien, spritejen sijainnin ja törmäysten hallinnassa. Rect-objekti sisältää tietoa sijainnista: x- ja y -koordinaatit vasemmasta yläkulmasta mitattuna sekä rectin leveydestä ja korkeudesta.

Rect sisältää siis vain paikkatietoa eikä näkyviä pikseleitä, toisin kuin surface. 

Rect-objektin avulla voit helposti sijoittaa ja saada selville pelielementtien paikkoja pelialueella. Se tarjoaa myös valmiita metodeja törmäysten tarkistamiseen eli siihen milloin kaksi tai useampaa rect-objektia koskettaa toisiinsa tai on päällekkäin keskenään.

Esim. alue-nimisen rectin luominen:
alue = pygame.Rect((10, 20, 200, 100))
10, 20 ovat vasemman yläkulman (x, y) koordinaatit ja 200, 100 ovat rectin leveys ja korkeus.

Pygamen Surface-luokassa on kätevä get_rect()-metodi, jolla saadaan tietoon surfacen rect:
pinta_rect = pinta.get_rect()
luo pinta_rect-nimisen rectin, jossa on pinta-surfacen leveys ja korkeus sekä oletussijanti (vas. yläkulma (0,0)).

 

Rect sisältää käteviä atribuutteja joiden avulla rectiä voidaan sijoitella joustavasti/saada tietoon ko. atribuutin arvo

x (vas. yläkulman x) y (vas. yläkulman y)    
top (yläreunan y) left (vas. reunan x) bottom (alareunan y) right (oik. reunan x)
topleft (vas. yläkulman x,y) bottomleft (vas. alakulman x,y) topright (oik. yläkulman x,y) bottomright (oik. alakulman x,y)
midtop (yläreunan keskipisteen x,y) midleft (vas.reunan keskipisteen x,y) midbottom (alareunan kesikipisteen x,y) midright (oikean reunan keskipisteen x,y)
center (keskipisteen x,y) centerx (keskipisteen x) centery (keskipisteen y)  
size (leveys, korkeus) width (leveys) height (korkeus)  
  w (leveys) h (korkeus)  

Atribuuteilla voidaan siis joko asettaa rectin ominaisuuksia tai kysellä niitä. Osassa atribuuteista kyse on yksittäisestä arvosta: x, y, leveys tai korkeus (esim. top) ja toisissa taas sekä x:n ja y:n tai leveyden ja korkeuden sisältävästä tuplesta (esim. center).

Esim.
Aiemmin luotu pinta_rect. Asetetaan rectin keskipiste koordinaateihin 100, 50:
pinta_rect.center = (100, 50)

Tulostetaan pinta_rectin leveys ja korkeus:
print(pinta_rect.size)
tulostaa:
(200, 100)

Sprite ja spritegroup

Spriteillä tarkoitetaan tietokonegrafiikassa yleisesti 2d-bittikarttakuvia joita voidaan liikutella itsenäisesti, taustagrafiikasta irrallaan. Lue lisää spriteistä (wikipedia).

Pygamen tapauksessa yksinkertaiset spriteihin liittyvät ominaisuudet (itsenäinen liikuttelu, törmäyksen tunnistus) voidaan kuitenkin hoitaa ilman varsinaista sprite-luokkaa, pintojen (surface) ja rect-objektin avulla. 

Sprite-luokan ominaisuuksia

Pygamen sprite luokka sisältää aliluokkia ja hyödyllisiä metodeja jotka helpottavat graafisten peliobejktien käsittelyä ja hallintaa.
spritejä voidaan ryhmitellä erilaisiin ryhmiin ja sama sprite voi tarvittaessa kuulua usemapaan erilaiseen ryhmään. 

Helpottavia metodeja ovat esimerkiksi:
  • update() -> päivittää kerralla kaikkien ko. ryhmään kuuluvien spritejen paikan
  • draw() -> piirtää kerralla kaikki ryhmän spritet näytölle
  • spritejen dynaaminen lisääminen tai poistaminen ryhmään add- ja remove-metodeilla. Spriten poisto ryhmästä törmäyksen yhteydessä esim. pelaajan ammuksen osuessa viholliseen.

Spriteryhmät mahdollistavat myös monipuolisemman törmäyksen tunnistuksen. Voidaan käsitellä mm. eri spriteryhmien välisiä törmäyksiä tai nelikulmaisen törmäysalueen sijasta käyttää ympyrää.

Spritestä voidaan myös muodostaa maski joka mahdollistaa pikselintarkan, spriten ääriviivojen mukaisen törmäyksen tunnistamisen (vrt. pelkkä rect, jossa on aina turhaa "ilmaa" välissä, ellei grafiikka ole nelikulmainen).