Tasohyppelypeli 1: Pelaajahahmon piirtäminen ja liikuttaminen
Tässä osassa päästään tositoimiin varsinaisen pelitilan kanssa! Tähän asti tekemämme alkuvalikko voi olla alkuvalikko millaiselle pelille tahansa, mutta nyt, kun alamme koodaamaan varsinaista pelitilaa, voisi olla hyvä selvittää, millaista peliä olemme toteuttamassa:
- peli on perinteinen tasohyppely, jossa keltainen neliö – pelaajahahmo – hyppelee harmaassa neliömaailmassa, kerää sinisiä neliöitä ja väistelee punaisia
- kun kaikki siniset neliöt on kerätty, peli on läpäisty
- jos pelaajahahmo osuu punaiseen neliöön tai putoaa ulos kentästä, hän kuolee ja kenttä alkaa alusta.
Kuulostaa tylsältä ja sitä se onkin. Tästä lähtökohdasta lienee kuitenkin jokainen tasohyppelypeli saanut alkunsa aikojen alusta tähän päivään asti. Ja neliöt kyllä korvaamme aikanaan ihan oikealla bittikarttagrafiikalla.
Pelitilan toteuttaminen aloitetaan koodaamalla ajastimen käsittelijä, jotta pelitilaa päivitetään sulavasti tasaisella ruudunpäivitysnopeudella. Sitten piirretään pelaajahahmo ja koodataan sen liikuttaminen nuolinäppäimillä.
TimerHandler – ajastimen käsittelijä
Määrittele main.h-otsikkotiedostoon volatile-muuttuja thCounter sekä lisää TimerHandler-funktion esittely.
Jos muuttuja määritellään volatileksi, sen arvo voi muuttua milloin tahansa ohjelman suorittamisen aikana.
Lisää sitten main.c-lähdekooditiedostoon TimerHandler-funktion määrittely. On tärkeää, että TimerHandler-funktion määrittely tulee ennen SetupProgram-funktion määrittelyä, koska SetupProgram-funktion määrittelyssä kutsutaan TimerHandler-funktiota. Huomaa myös makro END_OF_FUNCTION(TimerHandler) funktion määrittelyn lopussa.
Huomaa, että muuttujan thCounter arvoa lisätään vain siinä tapauksessa, kun häivytys ei ole käynnissä. Tällä korjaantuu bugi, jossa pelin alettua pelaajahahmo häivytyksen loputtua liikahtaa salamana uuteen paikkaan, jos sitä yritetään liikuttaa häivytyksen aikana.
Lisää sitten SetupProgram-funktion määrittelyyn alla olevat rivit.
Allegron funktiokutsu install_int_ex siis kutsuu TimerHandler-funktiota 60 kertaa sekunnissa (BPS_TO_TIMER(60)). Lisäksi lukitaan TimerHandler-funktion ja thCounter-muuttujan muistipaikat (LOCK_FUNCTION ja LOCK_VARIABLE).
Lisää sitten main-funktion activeGameState-switch-lauseeseen while-silmukka, jota suoritetaan aina, kun muuttujan thCounter arvo on suurempi kuin 0. Jos se on, toistaiseksi ei tehdä muuta kuin vähennetään muuttujan thCounter arvoa; myöhemmin tämän while-silmukan sisään tulee mm. funktiokutsu pelaajahahmon liikuttamiseksi.
Pelaajahahmon piirtäminen ja liikuttaminen
Pelaajahahmon piirtäminen
Tosiaan, toistaiseksi pelaajahahmo piirretään vain keltaisena neliönä. Tylsää... Mutta toimivaa!
Määrittele main.h-otsikkotiedostoon:
- vakio TILE_SIZE ja anna sen arvoksi 16;
- pelimaailmamme rakennetaan neliöistä, joita alan piireissä kutsutaan tiileiksi
- yksi tiili on kooltaan 16 pikseliä kumpaankin suuntaan
- vakio värille COLOR_PLAYER ja määritä se haluamaksesi; tässä tapauksessa pelaajahahmo on keltainen
- tietue Player, jolle luodaan muuttuja player ja jolla on neljä jäsentä:
- pelaajahahmon sijainti leveys- (x) ja pystysuunnassa (y)
- pelaajahahmon koko leveys- (width) ja pystysuunnassa (height)
- setupGameDone-kokonaislukumuuttuja, joka asetetaan todeksi, kun pelitilan alustus on suoritettu
- SetupGame-funktion esittely, jossa alustetaan pelitila
- DrawPlayer-funktion esittely, jossa piirretään pelaajahahmo.
Lisää main.c-lähdekooditiedoston SetupGame-funktion määrittely.
Muuttujien player.x ja player.y arvoksi laitetaan sen pikselin sijainti, johon pelaajahahmo halutaan asettaa; esim. jos kummankin arvo on 0, pelaajan sijainti on ruudun vasemmassa yläkulmassa.
Huomaa, että pelaajahahmon sijainti katsotaan sen vasemmasta yläkulmasta; jos siis pelaajahahmon halutaan olevan vaikkapa ruudun oikeassa yläreunassa pelin alkaessa, ruudun vaakaresoluutiosta pitää vähentää pelaajahahmon leveys ja asettaa niiden erotus player.x-muuttujan arvoksi (320 – 16 = 304). Eli jos ja kun haluat pelaajahahmon alkusijainnin olevan ruudun reunojen sisäpuolella, anna muuttujan player.x arvoksi 0–304 ja muuttujan player.y arvoksi 0–224.
Toistaiseksi pelaajasta tehdään yhden tiilen kokoinen antamalla vakion TILE_SIZE arvo muuttujille player.width ja player.height; pelaajahahmo on siis 16 pikseliä leveä ja korkea.
Lisäksi muuttujan setupGameDone arvoksi annetaan 1, jotta itse pelitilan alustus tehdään vain kerran, eli silloin kun peli alkaa. Sama tehdään muuttujan fadeInProgress arvolle, eli muulle koodille kerrotaan alkuhäivytyksen olevan käynnissä.
Lisää main-funktion activeGameState-switch-lauseeseen SetupGame-funktiokutsu.
Lisää MenuKeyInput-funktioon seuraava lause:
Lisää määrittely funktiolle DrawPlayer, jossa ei tehdä vielä muuta kuin piirretään värillä täytetty neliö Allegro-kirjaston funktiokutsulla rectfill. Sen parametrit ovat:
- piirtämisen kohde (buffer-näyttömuisti)
- neliön vasemman yläkulman sijainti vaakasuunnassa (player.x)
- neliön vasemman yläkulman sijainti pystysuunnassa (player.y)
- neliön oikean alakulman sijainti vaakasuunnassa (player.x + player.width - 1)
- neliön oikean alakulman sijainti pystysuunnassa (player.y + player.height - 1)
- neliön väri (COLOR_PLAYER).
Lisää sitten DrawGame-funktioon kutsu pelaajahahmon piirtämiselle:
Nyt kun lähdekoodin kääntää ja GAME.EXEn suorittaa, pelaajahahmo, joka ei vielä tottele näppäinpainalluksia, piirretään pelitilassa siihen kohtaan ruutua, joka määritettiin SetupGame-funktion player.x- ja player.y-muuttujien arvoilla.
Pelaajan liikuttaminen
Seuraavaksi alistetaan pelaajahahmo tahtoomme, eli laitetaan se tottelemaan nuolinäppäinten painalluksia.
Lisää main.h-otsikkotiedostoon MovePlayer-funktion esittely.
Lisää main.c-lähdekooditiedostoon MovePlayer-funktion määrittely, jossa tarkastellaan nuolinäppäinten painalluksia ja asetetaan pelaajahahmon sijainti.
Lisää main-funktion thCounter-silmukkaan funktiokutsu Moveplayer-funktiolle:
Siinä kaikki! Nyt pelaajahahmoa voi liikuttaa neljään suuntaan nuolinäppäimillä (tavallaan kahdeksaan, jos painat yhtä aikaa sekä sivu- että ylä- tai alanuolinäppäintä).
Jos haluat, ettei pelaajahahmo voi karata ruudun ulkopuolelle, pieni muutos MovePlayer-funktion määrittelyn näppäinpainallusten ehtolauseissa hoitaa homman. Eli, liikkuminen sallitaan jos:
- nuolinäppäintä ylös (key[KEY_UP]) painettaessa pelaajahahmon pystysijainti on suurempi tai yhtä suuri kuin 2 (player.y >= 2)
- nuolinäppäintä alas (key[KEY_DOWN]) painettaessa pelaajahahmon pystysijainti on pienempi tai yhtä suuri kuin 240 – (16 + 2) = 222 (player.y <= SCREEN_HEIGHT - (TILE_SIZE + 2))
- nuolinäppäintä vasemmalle (key[KEY_LEFT]) painettaessa pelaajahahmon vaakasijainti on suurempi tai yhtä suuri kuin 2 (player.x >= 2)
- nuolinäppäintä oikealla (key[KEY_RIGHT]) painettaessa pelaajahahmon vaakasijainti on pienempi tai yhtä suuri kuin 320 – (16 + 2) = 302 (player.x <= SCREEN_WIDTH - (TILE_SIZE + 2)).
Kommentit
Lähetä kommentti