В настоящее время я использую систему, которая читает x и y моей карты тайла в соответствии с набором тайлов и отображает относительное изображение. Это работает, однако я обнаружил, что создание карты вручную невероятно сложно, поэтому решил использовать программу под названием «Tiled», однако для этого нужно прочитать изображение, в моем случае каждые 32 пикселя и установить его как число, позвольте мне попробовать чтобы объяснить, представьте, что каждое из чисел ниже представляет собой квадрат размером 32×32 пикселей, число представляет, как Tiled сохраняет изображение в виде числа, пока оно не достигнет ширины (например, скажем, изображение имеет ширину 160 пикселей или 5 плиток), а затем новые строки продолжают считать ..
[1] [2] [3] [4] [5] [6] [7] [8] [9]Это выбрасывает мой скрипт, так как x и y не используются. Я пытался найти и как можно больше вещей, чтобы настроить свой код для чтения нового формата, но потерпел неудачу, ниже моя текущая функция для загрузки карты.
void LoadMap(const char*filename)
{
std::ifstream openfile(filename);
std::vector<sf::Vector2i> tempMap;
map.clear();
if(openfile.is_open())
{
std::string tileLocation;
openfile >> tileLocation;
tileTexture.loadFromFile(tileLocation);
tiles.setTexture(tileTexture);
while(!openfile.eof())
{
std::string str, value;
std::getline(openfile, str);
std::stringstream stream(str);
while(std::getline(stream, value, ' '))
{
if(value.length() > 0)
{
std::string xx = value.substr(0, value.find(','));
std::string yy = value.substr(value.find(',') + 1);
int x, y, i, j;
for(i = 0; i < xx.length(); i++)
{
if(!isdigit(xx[i]))
break;
}
for(j = 0; j < yy.length(); j++)
{
if(!isdigit(yy[j]))
break;
}
x = (i == xx.length()) ? atoi(xx.c_str()) : -1;
y = (j == yy.length()) ? atoi(yy.c_str()) : -1;
tempMap.push_back(sf::Vector2i(x, y));
}
}
if(tempMap.size() > 0)
{
map.push_back(tempMap);
tempMap.clear();
}
}
}
}
Все, что мне нужно, это сценарий, чтобы назначить каждому квадрату 32×32 число, затем начать новую строку и продолжить, пока не достигнет конца tilemap.png
Я прошу прощения, если это глупый запрос, я очень плохо знаком с c ++, поэтому любые советы по созданию моего кода для чтения нового формата будут с благодарностью, если вам нужна какая-либо другая информация, то дайте мне знать.
Если я правильно понимаю, у вас есть это соответствие, и вы хотите преобразовать N в {x, y} и / или наоборот.
X = 1 2 3 4 5
[ 1] [ 2] [ 3] [ 4] [ 5] y = 0
[ 6] [ 7] [ 8] [ 9] [10] y = 1
[ N]
Таким образом, следующее может помочь
void NToXY(unsigned int N, unsigned int& x, unsigned int& y)
{
x = (N - 1) % 5 + 1;
y = (N - 1) / 5 + 1;
}
void XYToN(unsigned int x, unsigned int y, unsigned int& N)
{
N = (y - 1) * 5 + x;
}
Вот статья, в которой рассказывается о том, как мозаика понимает данные карты. Разбор и рендеринг карт формата Tiled TMX в вашем собственном игровом движке
Здесь обсуждается, как преобразовать (x, y) координаты в «gid», который использует Tiled.
Суть в том, что они используют 1d Array для хранения всех данных плитки для игровой карты (а также используют 1d массив для индексации в карте текстуры плитки). Идея здесь заключается в том, что в компактном массиве 1d чисел вы можете использовать увеличение производительности из-за загрузки кэша.
Вот еще один вопрос, который более подробно описывает эту технику: Сопоставить двумерный массив с одномерным массивом C
Казалось бы, в ответе Jarod42 есть функции, которые вам понадобятся для выполнения математики / преобразования. Это было бы полезно для временного преобразования ваших систем. Я бы порекомендовал переписать ваш движок, чтобы использовать свойство GID более напрямую, так как это избавит вас от некоторой боли. Вы можете сохранить функции преобразования как вспомогательные функции для дальнейшего использования.