Minulta on varmaan jäänyt jotain huomaamatta. Jostain syystä kartan luku funktio ei nyt lue karttaa, kun päivitin sitä hieman.
Kansio:
/Data/Maps/testing_map.dat (tässä kansio polku siis kartan tiedostosta)
/* Tiedoston sijainti: /Data/game_data.hpp */ namespace GameData { std::vector <TEngine_V3::Kartta_tile> kartta_tilet; static void CheckRoom(int rooma); static void ReadMap(int map); } void GameData::ReadMap(int map) { TEngine_V3::Kartta_tilee a; int ii=0; std::ifstream virta("Maps/testing_map.dat"); while (virta.good()) { std::getline(virta, a.kuvan_nimi, '\t'); virta >> a.x >> a.y >> a.z >> a.vaikutus; virta.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); GameData::kartta_tilet.push_back(TEngine_V3::Kartta_tile(a.kuvan_nimi, a.x, a.y, a.z, a.vaikutus)); } virta.close(); }
Samassa tiedostossa CheckRoom funktiossa on tälläinen:
else if (rooma == 8) { ReadMap(1); TEngine_V3::piirra_kuva(TEngine_V3::Photos::tyhjenna, 0, 0, false, 0, 0); std::string asas=""; std::vector<TEngine_V3::Kartta_tile>::iterator kaartta_tilet = kartta_tilet.begin(); while(kaartta_tilet != GameData::kartta_tilet.end()) { if (kaartta_tilet->kuvan_nimi == "green") { TEngine_V3::piirra_kuva(TEngine_V3::Photos::green, kaartta_tilet->x, kaartta_tilet->y, false, 0, 0); } kaartta_tilet++; } } SDL_Flip(TEngine_V3::ruutu);
Sitten testasin että onko jokin vian whilessa väärin ettei näy ja pistin ReadMap funktioon seuraavan rivin:
GameData::kartta_tilet.push_back(TEngine_V3::Kartta_tile("green", 20, 20, 1, 1));
Ja se tulosti maata.
Sitten vielä tuon testing_map.dat tiedoston sisältö:
green 0 100 1 2 green 20 100 1 2
Tiedän, että tuli vähän vaikeasti selitettyä, mutta toivottavasti ymmärsitte. =)
Eli ongelma on, että se ei ilmeisesti löydä tiedostosta mitään vaikka siellä on tietoa.
Tuosta nyt ei näy tuon koodin koko rakennetta, mutta ymmärsinkö oikein että luet koko kartan tiedostosta joka framellä? Tavallisesti kartta luetaan muistiin kun peli alkaa, ja tuo on paitsi hidas, myös saattaa pidemmän ajan kuluessa stressata kiintolevyä ehkä jopa hajoamispisteeseen.
Päättelen siis tuosta SDL_Flip() kutsusta heti perään.
Tuskin se kiintolevyltä lukeminen on ongelma, eiköhän se ole ekan kerran jälkeen kakussa useimmat lukukerrat, vaan se turha kopiointi ja parsiminen joka kerralla.
Eli parsitaan kartta yhden kerran muistiin johonkin järkevään tietorakenteeseen ja käytetään sitä sitten sieltä.
Itse ongelmaan suosittelisin perinteistä ratkaisua, että tulostellaan niitä tietoja vähän joka välissä (ihan tiedoston lukemisesta alkaen) ja katsotaan, missä kohti alkaa mennä pieleen.
Itse tykkään tallentaa pelikartat siten, että yksi merkki tiedostossa kuvaa yhtä peliruutua. Pelikartta on näin myös helppo hahmottaa, kun allekkain olevat merkkirivit muodostavat suoraan 2-ulotteisen taulukon näkymän. Parsiminen on helppoa käsittelemällä puskuria merkki kerrallaan ( getc(), ungetc() ). Karttatiedostoon voi myös laittaa kommenttirivejä, jotka parserin on helppo jättää käsittelemättä.
Aihe on jo aika vanha, joten et voi enää vastata siihen.