Roguelike-opas:Kartan luominen
| Roguelike-oppaan sisältö |
|---|
Edellisissä luvuissa saatiin käyttöön curses-kirjasto ja hahmo liikkumaan että törmäämään seiniin. Nyt on tarkoitus luoda itse sisältö ruudulle. Tämän osion aiheena on karttojen luominen ja sen sisältämän struktuurin ymmärtäminen.
Tässä osiossa luodaan metsäinen kartta muutamalla funktiolla. Itse kartan sisällön voi myös muokkaa luolamaiseksi jos niin tahtoo, mutta sitä ei käsitellä tässä oppaassa.
Aivan aluksi ohjelma tarvitsee struktuurin karttaa varten. Se voi olla seuraavanlainen:
//kartan formaatti struct KARTTA { //80 on solurivin pituus ja 25 on solurivin korkeus. bool seina[80][25]; //tämä pitää tietoa siitä, onko tämä solu seinä vaik ei. char merkki[80][25]; //merkki, mikä piirretään ruudulle char vari[80][25]; //väri millä merkki piirretään bool nako[80][25]; //onko näkyvää aluetta };
Ja itse kartta on PELI-struktuurin sisällä. Peli-struktuuri voi näyttää nyt tältä:
//peliin liittyvät muuttujat yhdessä nivaskassa. struct PELI { KARTTA kartta; //pelikartta OLENTO pelaaja; //pelaaja } peli;
Näiden jälkeen tarvitaan funktio, joka luo itse kartan ja piirtofunktio, mikä piirtää kartan.
Kartan luomisfunktio voi olla seuraavanlainen, jossa luodaan seinät reunoihin ja esteitä (puita) pitkin karttaa:
void luo_kartta() //tehdään yksinkertainen kartta { //käydään koko kartan solut läpi for (int x = 0; x < 80; x++) { for (int y = 0; y < 25; y++) { if (x > 0 && x < 79 && y > 0 && y < 24) //tehdään kartan sisälle "nurmikkoa" { peli.kartta.seina[x][y] = false; peli.kartta.merkki[x][y] = '#'; peli.kartta.vari[x][y] = vihrea; } else { //tehdään kivireunat peli.kartta.seina[x][y] = true; peli.kartta.vari[x][y] = 0; peli.kartta.merkki[x][y] = '*'; } } } //lopuksi tehdään puita: int puumaara = rand() % 25; int x = 0; int y = 0; for (int i = 0; i < puumaara; i++) { while(1) //silmukasta hypätään pois kunnes koordinaatit on kohdassa, jossa on jotain vihreää: "ruohoa". { x = rand() % 80; //etsitään satunnaisuudella sopiva paikka y = 2+ rand() % 23; if (peli.kartta.vari[x][y] == vihrea) //löytyi sopiva break; } peli.kartta.merkki[x][y] = 'A'; //tehdään "puu" peli.kartta.vari[x][y] = vihrea2; peli.kartta.seina[x][y] = true; } }
Ja jotta karttaa voi kokeilla, tarvitsee ohjelma piirtofunktion karttaa varten.
void piirra_kartta() { //alla olevaan kahteen muuttujaan säilötään kartan graafiset tiedot per solu char merkki = 0; char vari = 0; //käydään koko kartta läpi for (int x = 0; x < 80; x++) { for (int y = 0; y < 25; y++) { merkki = peli.kartta.merkki[x][y]; //otetaan merkit talteen vari = peli.kartta.vari[x][y]; mvaddch(y, x, merkki|COLOR_PAIR(vari)); //itse piirto ruudulle } } return; }
Kuinka näitä pääsee käyttämään pelissä?
Main-funktiossa ennen silmukkaa kutsutaan luo_kartta()-funktiota, joka rakentaa jonkinlaisen kartan. Ja silmukassa ennen kuin piirretään pelaaja, mutta silti näppäinpainallusten jälkeen kutsutaan piirra_kartta()-funktiota.
Kun ohjelma on käännetty, voidaan huomata, että jotain puuttuu. Esteiden läpi pääsee, ja ne ei vaikuta hahmoon millään tavoin. Tähän on ratkaisuna pieni muutos este-funktiossa:
Muuta este-funktion sisältö seuraavanlaiseksi:
bool este(int x, int y) { if (x < 0 || y < 0 || x > 80 || y > 25) return true; else return peli.kartta.seina[x][y]; /*tämä on muunnettu rivi. Aikaisemmin se palautta aina false-arvon, mutta nyt palautetaan kartan struktuurista seinän arvo, mikä on merkattu karttaa luodessa joko true- tai false-tilaan. */ }