我怎么能有一个地图数组?

时间:2013-01-25 22:54:06

标签: c++

如何在游戏中加载Levels,因为第1层是Objects,第2层是Characters等等。我只需要3层,它们将全部放在一起。即将一朵透明背景的花放在草地或下面的污垢上。我想从同一个文件中读取。我该怎么做呢?任何帮助,将不胜感激。

我从级别文件加载地图,这些文件只是与图块中的图块对应的数字。

这是解释它的代码

void LoadMap(const char *filename, std::vector< std::vector <int> > &map)
{
    std::ifstream openfile(filename); 
    if(openfile.is_open())
    {
        std::string line, value;
        int space;

        while(!openfile.eof())
        {
            std::getline(openfile, line);

            if(line.find("[TileSet]") != std::string::npos)
            {
                state = TileSet;
                continue;
            }
            else if (line.find("[Layer1]") != std::string::npos)
            {
                state = Map;
                continue;
            }

            switch(state)
            {
            case TileSet:
                if(line.length() > 0)
                    tileSet = al_load_bitmap(line.c_str());
                break;
            case Map: 

                std::stringstream str(line);
                std::vector<int> tempVector;

                while(!str.eof())
                {
                    std::getline(str, value, ' ');
                    if(value.length() > 0)
                                 tempVector.push_back(atoi(value.c_str()));
                }
                map.push_back(tempVector);
                break;
            }
        }
    }
    else
    {
  }
  }

这就是它绘制地图的方式。瓷砖片也是1280乘1280,而tilesizeX和tilesizeY是64

void DrawMap(std::vector <std::vector <int> > map)
{    
    int mapRowCount = map.size();

    for(int i, j = 0; i < mapRowCount; i ++)
    {
        int mapColCount = map[i].size();

        for (int j = 0; j < mapColCount; ++j)
        {
              int tilesetIndex = map[i][j];
              int tilesetRow = floor(tilesetIndex / TILESET_COLCOUNT);
              int tilesetCol = tilesetIndex % TILESET_COLCOUNT;    
              al_draw_bitmap_region(tileSet, tilesetCol * TileSizeX, tilesetRow * TileSizeY, TileSizeX, TileSizeY, j * TileSizeX, i * TileSizeX, NULL);
        }
    }
}

编辑:http://i.imgur.com/Ygu0zRE.jpg

1 个答案:

答案 0 :(得分:2)

看起来你需要多个二维数组。

尝试这样的事情:

unsigned int map[3][8][8];
#define OBJECTS_LAYER 0
#define CHARACTER_LAYER 1
#define FLOWER_ID 2

//...

map[OBJECTS_LAYER][3][4] = FLOWER_ID;

编辑1

根据OP的描述,图层是一个2维数组,8 x 8,表示为:

unsigned int layer[8][8];

OP的地图有多个图层。这转化为一个层的容器 一种方法是使用数组的另一个维度。就像层状蛋糕或建筑物中的地板一样。

unsigned int map[/* maximum layers */][8 /* from layer above */][8 /* from layer above */];

要访问第1层的位置[3,4],表达式为:

map[0][3][4]

由于索引在C ++中从零开始,因此第一层的索引为零。

要访问建筑物的第3层,第2行,第7列,将使用命名法:

empire_state_building[2][1][6]