Isometric tile map structure

Started by
-1 comments, last by MustSeeMelons 10 years, 6 months ago

HI!

Me and a few of my friends are making an isometric tile based RPG, and I have a question regarding the structure of the tile map - how to save it?

For now I am using a simple 2D vector of my Tile class, but I have a feeling that's not such a good idea, or is it?

I'm building a class so that I can store game levels and everything associated with the level (characters, items, tile textures etc.) and I'm having trouble with the scope of vectors push_back();

The class itself has the variable gameLevel, which is the 2D vector, containing the tiles. The class has a function, to read from a file all the necessary information regarding the level(which tile textures to load, how big the map is, and the tiles.. {1,1,1} {2,1,2}). Textures are loaded to a map, so that the Tiles can have their pointers to the texture (Is it OK?), then come the tile map, the code is as follows:

EDIT: Found the problem, it was a silly one, std::string::find() was returning a garbage value, because I was searching for the wrong delimiter, so embarrassing.


void GameLevel::CreateLevel(std::string dataFileName){
    std::ifstream levelData;
    int lineCounter=0;
    std::string line;
    std::string delim=" ";
    levelData.open(dataFileName.c_str());

    gameLevel=std::vector<std::vector<Tile> >(levelHeight);
    //std::vector<std::vector<int> > tempLevel=std::vector<std::vector<int> >(levelHeight);
    unsigned int row=0;

    while(!levelData.eof()){
        std::getline(levelData, line);
        if(lineCounter==0){
            int pos=line.find(delim);
            std::string temp=line.substr(pos+1, pos+1);
            TILE_WIDTH=atoi(temp.c_str());
        }
        else if(lineCounter==1){
            int pos=line.find(delim);
            std::string temp=line.substr(pos+1, pos+1);
            TILE_HEIGHT=atoi(temp.c_str());
        }
        else if(lineCounter==2){
            int pos=line.find(delim);
            std::string temp=line.substr(pos+1, pos+1);
            levelWidth=atoi(temp.c_str());
        }
        else if(lineCounter==3){
            int pos=line.find(delim);
            std::string temp=line.substr(pos+1, pos+1);
            levelHeight=atoi(temp.c_str());
        }
        else if(lineCounter>4){
            if(line.find(",")!=std::string::npos){
            int delimPos=0;
            std::string token;
            while((delimPos=line.find(delim))!=std::string::npos){
                token=line.substr(0,delimPos);
                tempLevel[row].push_back(atoi(token.c_str()));             NOT BEING SAVED!
                //tempLevel.at(row).push_back(2);
                line.erase(0,delimPos+delim.length());
            }
            row++;
            }
            else{
                int pos=line.find(".");
                std::string key=line.substr(0,pos);
                tileTextures.insert(std::pair<std::string, GameTexture>(key, GameTexture(*render, line)));
            }

        }
        lineCounter++;
    }

    std::cout<<"Tile count: "<<tileTextures.size()<<" "<<"Temp array size: "<<tempLevel.size()<<" "<<"Temp array first row size: "<<tempLevel.at(0).size()<<"\n";

    levelData.close();
}

tempLevel is just an 2D int vector to save the corresponding int's to textures. Any help would be very nice smile.png Any other topics or good reads would be appreciated too.

P.S. The screen of the current state - the ability to walk with a dude around.

[attachment=18077:shot.png]

This topic is closed to new replies.

Advertisement