Roguelike-opas:Liikkuminen ja esteet
| Roguelike-oppaan sisältö |
|---|
Edellisessä luvussa luotiin hieman alkua peliprojektille, joka toimii komentopäätteessä. Tässä osassa laitetaan pelaaja liikkumaan kartalla ja tutustutaan hieman paremmin curses-kirjastoihin.
Aivan aluksi meidän on tehtävä hahmolle oma datastruktuuri, joka on seuraavanlainen:
//pelissä olevien olentojen ja pelaajan formaatti struct OLENTO { int x; //koordinaatti jossa hahmo sijaitsee int y; //sama int target_x; //vihollisten käytössä: apumuuttujat joihin on laitettu tietoa, mihin suuntaan vihollinen koittaa liikkua int target_y; //sama int energia; //pelaajan tai vihollisen energiamäärä int terveysjuoma; //pelaajan terveysjuomien määrä int voima; //pelaajan tai vihollisen voima int moodi; //tekoälyn moodi, eli tila. };
Struktuuri on lisättävä #define-rivien jälkeen ennen funktioiden alkua.
Tämän jälkeen vielä luodaan olio pelaajasta, jonka sisältö on itse OLENTO-struktuurin mukainen.
On tehtävä vielä toinen struktuuri, jonka sisällä on kaikki globaalit muuttujat. Tämän tarkoitus on helppo ylläpidettävyys:
struct PELI { OLENTO pelaaja; //pelaaja } peli;
Jotta pelaaja saadaan liikkumaan, on tutkittava mitä kirjaimia painetaan näppäimistöstä. Main-funktion sisällä on silmukka, joka loppuu q-merkkiin. Silmukan ulkopuolelle voidaan kirjoittaa seuraavanlainen rivi:
peli.pelaaja.x = 5; peli.pelaaja.y = 4;
Nyt pelaajan koordinaatit on asetettu johonkin kohtaan karttaan. Mutta itse pelaaja ei näy vielä piirtotapahtumassa, jotenka se tehdään seuraavaksi:
Luo funktio void piirra_pelaaja(), ja sijoita se ennen main-funktiota olevaan tilaan. Tai jos kirjoitat sen main-funktion jälkeen, täytyy funktion esittely kirjoittaa koodin alkupuolelle ennen mitään funtkiota.
void piirra_pelaaja(int x, int y) { mvaddch(y, x, '@'|A_BOLD); //@-merkki sovittuun koordinaattiin. Perässä oleva A_BOLD tekee merkistä erottuvamman. }
Nyt voidaan kutsua funktiota main-funktion sisällä olevassa silmukassa. Lisää ennen silmukan loppua (ennen }-merkkiä) rivi:
piirra_pelaaja(peli.pelaaja.x, peli.pelaaja.y);
Hahmo ei silti vielä liiku, jotenka seuraavaksi on näppäimistön vuoro. Main-funktion sisällä ennen silmukkaa voidaan luoda kaksi apumuuttujaa: x ja y. Näihin tallennetaan arvot -1 tai +1 riippuen mitä näppäintä on painettu. Alla esimerkki liikkumisesta ja näppäimistönkäsittelystä:
//main-funktio: int main() { alusta_curses(); int ch, x, y = 0; peli.pelaaja.x = 5; peli.pelaaja.y = 4; ch = 0; while(ch != 'q') //silmukka loppuu kun painetaan q:ta (tai jos jokin funktio palauttaa -1) { x = 0; y = 0; ch = getch(); //otetaan näppäimistöstä jokin painallus //ehdoissa on nuolinäppäinten arvot: KEY_LEFT, KEY_RIGHT, KEY_UP ja KEY_DOWN if (ch == KEY_LEFT) x = -1; if (ch == KEY_RIGHT) x = 1; if (ch == KEY_UP) y = -1; if (ch == KEY_DOWN) y = 1; peli.pelaaja.x += x; peli.pelaaja.y += y; erase(); //tyhjentää ruudusta kaikki merkit ja värit. piirra_pelaaja(peli.pelaaja.x, peli.pelaaja.y); } endwin(); //sulkee cursesin käytön jälkeen. return 0; }
Peli osaa hyödyntää curses-kirjastoa, osaa liikuttaa olentoa ja olentojen struktuuri on tehty valmiiksi, kuin myös näppäimistön luku onnistuu. Seuraavaksi on luotava yksinkertainen kartta ja estetörmäys.
Esteet
Nyt pelissä voi jo liikkua, mutta samalla pääsee kuvan ulkopuolelle, mikä ei ole sallittua. On aika tehdä estetörmäykseen liittyvä funktio. Mutta myös yksinkertainen kartta ja tälle piirtorutiinit.
Syy, miksi aikaisemmin itse liikkuminen tehtiin kovin vaivalloisesti (kuljetettiin tietoa muuttujasta toiseen) on siinä, että se lopulta helpottaa este-tilan luomista.
Luo seuraavanlainen funktio:
bool este(int x, int y) { if (x < 0 || y < 0 || x > 80 || y > 25) //jos koitetaan osoittaa kentä ulkopuolelle, ilmoitetaan että se on este-aluetta. return true; else //muussa tapauksessa ilmoitetaan, ettei ole seinää. return false; }
Ja main-funktiossa, jossa sijoitetaan arvot pelaajan koordinaatteihin luodaan muutos:
peli.pelaaja.x += x; peli.pelaaja.y += y;
->
if (!este(peli.pelaaja.x + x, peli.pelaaja.y + y)) { peli.pelaaja.x += x; peli.pelaaja.y += y; }
Nyt kun ajaa ohjelman, voi huomata, ettei pelaaja mene enää kentän ulkopuolelle. Myöhemmin este-funktioon tulee lisäystä, kun kartan struktuuri on valmis.