2

タイルシートのタイルに対応する数字だけのレベル ファイルからマップを読み込みます。

レベルファイルはこちら

[Map]
0 1 0 0 0 0 0 0
0 0 20 0 0 0 0 0
0 0 0 40 0 0 0 0
0 0 0 0 63 0 0 0
0 0 0 0 0 79 0 0
0 0 0 0 0 0 0 0

そして、これがそれを解釈するコードです

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("[Map]") != 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
    {
  }
  }

これがその外観です http://i.imgur.com/6W49eWf.jpg

わかりましたので、私のタイルシートは 1000 x 200 で、次のようになりますhttp://i.imgur.com/Y83zBxj.png

マップ ファイルに 20 または 40 を入れるときに、20 または 40 にラップ アラウンドするにはどうすればよいですか?

void DrawMap(std::vector <std::vector <int> > map)
{    
    for(int i, j = 0; i < map.size(); i ++)
    {
        for(j = 0; j < map[i].size(); j ++)
        {
          al_draw_bitmap_region(tileSet, map[i][j] * TileSizeX, 0, TileSizeX, TileSizeY, j   * TileSizeX, i * TileSizeX, NULL);
        }
    }
}

また、TileSizeX と TileSizeY は 50 です

4

1 に答える 1

1

ターゲット タイルが位置するタイルセットのセルを計算する必要があります。タイルセット インデックスがあります。タイルセットのサイズに基づいて、簡単な計算を使用して、そのタイルの列と行を決定します。

//This is how many columns your tileset can have.
//You could even dynamically calculate this if you wanted.
static const int TILESET_COLCOUNT = 20;

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

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

        for (int j = 0; j < mapColCount; ++j)
        {
            //This is your tileset index in your level map.
            int tilesetIndex = map[i][j];

            //The tileset row can be calculated by dividing the tileset index by the number of columns in a tileset row.
            int tilesetRow = floor(tilesetIndex / TILESET_COLCOUNT);

            //The tileset column can be calculated by retrieving the remainder of the modulus operation on the total number of columns in a row.
            int tilesetCol = tilesetIndex % TILESET_COLCOUNT;

            al_draw_bitmap_region(
                tileSet, //The tileset
                tilesetCol * TileSizeX, //multiply the tileset column by the size of a tile to get the source x
                tilesetRow * TileSizeY, //multiply the tileset row by the size of a tile to get the source y
                TileSizeX, //width
                TileSizeY, //height
                j * TileSizeX, //destination x
                i * TileSizeX, //destination y
                NULL //flags
            );
        }
    }
}
于 2013-01-22T19:02:04.113 に答える