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.