Как мне получить мой TileSheet для упаковки?

Я загружаю карту из файла уровней, которые являются просто числами, соответствующими плитке в листе плиток.

Вот файл уровня

[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

Итак, мой Tilesheet 1000 на 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

2

Решение

Вам нужно вычислить, в какой ячейке набора тайлов находится ваша целевая плитка. У вас есть индекс набора тайлов. Используйте небольшую математику, основанную на размерах набора плиток, чтобы определить столбец и строку этой плитки.

//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
);
}
}
}
1

Другие решения

Других решений пока нет …