Sign in to follow this  

Isometric tile map structure

This topic is 1572 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

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]

Edited by MustSeeMelons

Share this post


Link to post
Share on other sites
Sign in to follow this