Eli olis vähän ongelmaa ifstreamin kanssa, ongelma selitetty koodin kommentiss.
Pari päivää oon miettinyt erinlaisia ratkasuja, mut mitkään eivät oo toimineet, joten toivottavasti löydätte ratkaisun.
void Map::load(std::string name) { std::ifstream fin; std::string load_tmp = "Data/Map/"+name; fin.open(load_tmp.c_str()); if(fin) { //Luetaan leveys, korkeus ja pelaajan aloituspaikka fin>>this->w>>this->h>>this->playerStartX>>this->playerStartY; //Luodaan pari apumuuttujaa std::string name; //onko seinä vai lattia tmp_w = true : seinä, muuten lattia. bool tmp_w; int type = 0; //vihun tiedot float enemyStartX, enemyStartY; short int enemyType, enemyStartSpeed, enemyStartEnergy; //Luetaan vihollisten määrä tiedostosta fin>>this->enemies; //jos vihollisia if(this->enemies) { //Varataan muisti vihollistaulukolle. this->tmp = new Enemy[this->enemies]; //haetaan tiedostosta vihollisten tiedot ja sijoitetaan ne olioon. for(int i = 0; i > this->enemies; i++) { fin>>enemyType>>enemyStartX>>enemyStartY>>enemyStartSpeed>>enemyStartEnergy; this->tmp[i].setX(enemyStartX); this->tmp[i].setY(enemyStartY); this->tmp[i].setType(enemyType); this->tmp[i].setSpeed(enemyStartSpeed); this->tmp[i].setEnergy(enemyStartEnergy); } } //varataan muisti tilemapille tilemap = new Tile* [this->w]; for(int i = 0; i < this->w; ++i) tilemap[i] = new Tile[this->h]; /////////////////////////////////////////////// /////////////////////////////////////////////// /////////////////////////////////////////////// /* Tässä silmukassa ongelma, jos vihollisia on enemmän kuin 0, niin tämäkin yrittää ladata vihollisten tietoja, miksei tää vaan jatka seuraavalta riviltä??????????????????????????? Esimerkkiä tiedostosta (HUOM väliaikainen formaatti, teen binaarina, kuhan jaksan tehdä kenttäeditorin.) 10 10 100 100 1 12 12 12 2 20 tilejen tiedot... Jos alku on tuollainen, niin silmukka yrittää ladata kuvan, jonka nimi on 12, vaikka ei pitäis vaikuttaa noiden rivien ollenkaan tuohon tilejen lataukseen. 10 10 100 100 0 tilejen tiedot... Tämä taas toimii ihan oikein... :S:S:S */ //ladataan tiedostosta tarvittavat tiedot for(int i = 0; i < this->w; i++) { for(int j = 0; j < this->h; j++) { fin>>name>>tmp_w>>type; this->tilemap[i][j].type = type; this->tilemap[i][j].wall = tmp_w; this->tilemap[i][j].image= this->loadImage(name); } } } }
Ensimmäisellä pikaisella vilkaisulla:
vehkis91 kirjoitti:
for(int i = 0; i > this->enemies; i++)
Opettele käyttämään tavallisia debug-temppuja. Tämänkin olisit voinut ratkaista yksinkertaisesti tulostamalla tuossa viallisessa silmukassa ladatut tiedot (havainto: ei tulostu mitään, eli silmukkaa ei ajeta) tai lukemalla ja tulostamalla tiedostosta seuraavan rivin getline-funktiolla (tuloksena olisi ollut "12 12 12 2 20").
{std::string tmp; std::getline(fin >> std::ws, tmp); std::cout << tmp << std::endl;}
Toinen hyvä vaihtoehto olisi käyttää debuggeria, jolla voisi ajaa koodia rivi kerrallaan, jolloin taas näkisi suoraan, ettei silmukassa käydä. Toisaalta omakin havaintosi oli, että tiedostonimeksi tulee "12", jolloin pitäisi kyllä heti ymmärtää, että jostain syystä aiemmat tiedot ovat jääneet lukematta (eli luetaankin virheellisesti vasta seuraavassa vaiheessa).
P.S. Binaaritiedoston huono puoli on heikompi porttautuvuus esim. big endian -koneille tai muihin järjestelmiin, joissa tietotyypeillä on erilaiset koot ja/tai formaatit.
Johan oli taas pieni vika... Vertailuoperaattori vain väärinpäin... No onneks huomasit sen.
Aihe on jo aika vanha, joten et voi enää vastata siihen.