Tasohyppelypeli 6: Kentän skrollaaminen
Tässä osassa mahdollistetaan se, mikä tekee pelistä kuin pelistä oikeasti mielenkiintoisen ja jopa jännittävän: koodataan ruutua suurempi kenttä ja skrollataan sitä pelaajahahmon liikkuessa; näin koko kenttä ei lävähdä pelaajan näkyviin heti alussa, ja pelaajassa herää uteliaisuus tutkia koko kenttä.
Kamera siis seuraa pelaajahahmoa, mutta teknisesti emme koodaa mitään pelaajahahmon mukana kulkevaa kameraa, vaan pelaajahahmon liikuttamisen sijaan liikutetaan – eli skrollataan – koko kenttää. Tämä saa aikaan illuusion kameran liikkumisesta pelaajahahmon mukana. Ja jos pelaajahahmo sitten saavuttaa kentän reunat, pysäytetään kentän skrollaaminen ja liikutetaan itse pelaajahahmoa niin kauan, kunnes sen liikkuminen jatkuu keskemmälle kenttää.
Tähän peliin skrollaaminen toteutetaan ainoastaan sivusuunnassa, eli kentät ovat edelleen vain 15 tiiltä korkeita. Mutta historia on osoittanut, että hyvin toimii pelkkä sivusuuntainen skrollaaminen Super Mario Brosissakin, joten ei hätää.
Määrittele main.h-otsikkotiedostoon vakio SCREEN_MIDDLE_X, jonka arvoksi annetaan ruudun keskilinja vaakasuunnassa. Tätä tarvitaan pelaajahahmon sivusuuntaisen sijainnin tarkastelemiseksi, kun saavutaan kentän reunoihin.
Muuta vakion MAP_WIDTH arvoksi 40; kasvatamme siis kentästämme 40 tiiltä leveän aiemman 20:n sijaan.
Sitten seuraa taas mälsää kentänrakennustoimintaa eli muuta taulukon map[MAP_HEIGHT][MAP_WIDTH] alkioita. Ole tarkkana, että yhdelle riville tulee täsmälleen se määrä alkioita, jonka annoit vakion MAP_WIDTH arvoksi – tässä tapauksessa siis 40.
Luo Tile-tietuemuuttuja mapBounds sekä kokonaislukumuuttuja stopCamera, joita tarvitaan skrollaamisen toteuttamisessa;
- mapBounds-muuttujaa käytetään kentän reunojen sijainnin selvittämiseksi
- stopCamera-muuttujaa käytetään skrollaamisen pysäyttämiseksi kentän reunoissa.
Lisää vielä esittely funktiolle GetMapBounds.
Lisää main.c-lähdekooditiedoston SetupGame-funktion määrittelyyn alkuarvot muuttujille tile.x1 ja stopCamera ja anna kummankin arvoksi 0. Pelin alkaessa näkyvissä on siis kentän vasen reuna, eikä skrollaamista ole pysäytetty.
Lisää main.c-lähdekooditiedostoon GetMapBounds-funktion määrittely, jossa käydään kenttä läpi ja annetaan muuttujien mapBounds.x1, mapBounds.y1, mapBounds.x2 sekä mapBounds.y2 arvoksi kentän nurkkien sijainti.
Lisää main.c-lähdekooditiedoston DrawGame-funktion määrittelyyn GetMapBounds-funktion kutsu.
Seuraavaksi muokataan taas MovePlayer-funktion määrittelyä. Tee alla olevat muutokset vasemman ja oikean nuolinäppäimen painallusten tarkistukseen. Huomaa myös niiden jälkeen oleva muutos, jossa joko skrollataan kenttää tai liikutetaan pelaajahahmoa sivusuunnassa.
Nyt pelimaailmaa löytyy ruudun ulkopuoleltakin, ja "kamera" seuraa pelaajahahmoa ja pysähtyy kentän reunoihin. Kun aiemman osan koodimuutokset nostivat vaikeustasoa, nyt nousi mielenkiintoaste, sillä kun kaikkia kentän iloja ja harmeja ei paljasteta pelaajalle kerralla, hänessä herää väistämättä halu kurkistaa vielä yhden "kulman" taakse. Tämä se vasta on peliä!
Nyt ollaan saavutettu ensimmäinen merkittävä etappi meidän DOS-pelikoodaustaipaleellamme; peli on tietyllä tapaa täydellinen, sillä sen mekaniikka toimii, sen voi hävitä ja läpäistä, ja kaiken kruunaa toimiva alkuvalikko. (Ai niin: alkuvalikon Options-kohdehan ei toimi. Menepäs ja hoida homma, tee siitä vaikka How to play, jos et keksi, millaisia asetuksia siellä voisi olla). Ja jos tämän kummempaa grafiikkaa ei tarvita, pelin voi sanoa olevan jopa valmis – taputa itseäsi selkään, jos pääsit tänne asti!
Saapa nähdä, mitä seuraavaksi tapahtuu tämän projektin parissa. Vai tapahtuuko mitään. Eli tuleeko tästä joskus ns. kolmen A:n peli omalla kahdeksanbittisellä paletilla, bittikarttagrafiikalla, sprite-animaatioilla sekä äänillä ja MIDI-musiikilla? Voisiko kenttiäkin olla enemmän kuin yksi, ja edistyminen tallennettaisiin aina, kun edellinen kenttä on läpäisty? Olisipa mahtavaa tehdä kaikki tuo... Mutta aika on rajallinen, ja minulla on paha tapa sinkoilla kiinnostuksen kohteideni kanssa ympäriinsä. Mutta ehkä joskus!
Kommentit
Lähetä kommentti