Присвойте плитке «плитки» и числовое значение для 2d игры

0

В настоящее время я использую систему, которая читает x и y моего tilemap в соответствии с таблицей и отображает относительное изображение. Это работает, однако я обнаружил, что создание карты вручную невероятно сложно, поэтому было решено использовать программу под названием "Tiled", однако это означает, что читается изображение, в моем случае каждые 32px и устанавливают его как число, позвольте мне попробовать для объяснения, представьте себе, что каждый из приведенных ниже чисел представляет собой квадрат 32x32px, число представляет, как Tiled хранит изображение как число до тех пор, пока оно не достигнет ширины (например, скажем, изображение имеет ширину 160 пикселей или 5 плиток) изображения, затем новые строки продолжают считать.

[1] [2] [3] [4] [5]

[6] [7] [8] [9]

Это выдает мой скрипт, так как x и y не используются. Ive попробовал поискать и так много вещей, как я могу настроить мой код, чтобы читать новый формат, но не удалось полностью, ниже моя текущая функция для загрузки карты.

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();
        }
    }
}
}

Все, что мне нужно - это сценарий, который присваивает каждому квадрату 32x32 число, а затем запускает новую строку и продолжается до тех пор, пока не достигнет конца tilemap.png

Я прошу прощения, если это глупый запрос, я очень новичок в c++, поэтому любые указатели на то, чтобы мой код читал новый формат, были бы с благодарностью оценены, если вам нужна какая-либо другая информация, тогда дайте мне знать.

Теги:
2d
tile

2 ответа

1

Если я правильно понимаю, у вас есть это соответствие, и вы хотите преобразовать 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;
}
0

Здесь статья, в которой описывается логика того, как плитка понимает данные карты. Анализ и рендеринг Tiled TMX Format Карты в вашем собственном игровом движке

В нем обсуждается, как преобразовать (x, y) координаты в "gid", который использует Tiled.

Суть его в том, что они используют 1d-массив для хранения всех данных плитки для игровой карты (а также использование массива 1d для индексирования в карту текстуры плитки). Идея здесь заключается в том, что в компактном 1d массиве чисел вы можете использовать увеличение производительности из-за загрузки кеша.

Здесь возникает еще один вопрос, который более подробно описывает эту технику: Сопоставьте 2D-массив на 1D-массив C

Казалось бы, ответ Jarod42 имеет функции, необходимые для математики/преобразования. Это было бы полезно для временного преобразования ваших систем. Я бы рекомендовал переписать свой движок, чтобы более эффективно использовать свойство GID, хотя, поскольку это сэкономит вам немного боли. Вы можете сохранить функции преобразования в качестве вспомогательных функций позже.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню