Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Tiedoston luku ongelma

mika132 [26.09.2011 17:56:27]

#

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.

User137 [26.09.2011 19:17:11]

#

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.

Grez [26.09.2011 19:52:33]

#

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ä.

Metabolix [26.09.2011 19:57:46]

#

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.

jalski [26.09.2011 20:42:06]

#

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ä.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta