Как закодировать многоуровневую изометрическую карту?

Я уже работал с изометрическими сетками в прошлом, но в моем текущем проекте я нашел проблему, я не уверен, как ее решить. Я пытаюсь создать нечто похожее на то, что находится на экране ниже:

 Пример карты

У меня возникают проблемы с тем, как представлять плитки. С плоской изометрической сеткой 2d все, что вам нужно, это массив 2d (даже если у вас есть возвышение, вы можете просто иметь переменную z там, чтобы ее отслеживать, а затем визуализировать на основе переменной z плюс переменную z соседних плит). Однако я не уверен, как это сделать.

Мой план состоял в том, чтобы карта состояла из 4-сторонних многоугольников, которые могут быть размещены в любом месте и иметь (x, y, z) позицию. Рендеринг достаточно прост (начните с самых низких z-плиток, перейдите на следующий уровень, добавьте любую лестницу, которая заканчивается на этом уровне, повторяйте до тех пор, пока не будут отображены все плитки).

Однако, как я могу выполнить проверку на столкновение? Проверка, является ли точка (игрок) внутри многоугольника не слишком сложной, но как я могу узнать, может ли он переместиться на другую плиту?

Что было бы лучше:

  • У плиток есть указатель на соседние плитки? (Похоже, много проблем с кодом для редактора).
  • Сортировка массива по Z-уровню, затем поиск по массиву для достаточно близких фрагментов? (Кажется медленным)
  • Что-то еще полностью?
3 голоса | спросил MKII 23 J0000006Europe/Moscow 2016, 09:51:27

1 ответ


2

Одним из подходов к многослойной карте будет массив (или двумерный массив) связанных списков или векторов, содержащих объекты плитки. Таким образом, ваша структура фрагмента будет либо содержать указатель на следующую плиту над ней, либо у вас будут «стеки» плиток разной высоты, распределенных по сетке. По существу это создает 3D-массив.

Хорошая, хотя и старая статья на многослойных картах будет здесь: http://www-cs-students.stanford.edu/~amitp/Articles/Tiletech.html

Так, например, ваша структура структуры будет выглядеть как-то в этом направлении:

struct Tile
    {
    unsigned char type;
    Tile * next = NULL;
    };

Карта сама по себе, если, например, это была 2D-сетка, выглядела бы так:

Tile tile_map[rows][cols];

Чтобы затем получить плитку в определенный момент, чтобы проверить, сталкивается она или нет, вы должны перебирать список в этой точке, пока не достигнете желаемой позиции z.

unsigned char getTileType(int x, int y, int z)
    {
    //Assuming 0 means an empty (air) tile
    unsigned char tile_type = 0;

    Tile * tile = &tile_map[x][y];

    //Iterate through the linked list of tiles  at this position
    int height = 0;
    while (height < z && tile)
        {
        tile = tile -> next;
        ++height;
        }

    if (tile)
        tile_type = tile -> type;

    return tile_type;
    }
ответил Salajouni 23 J0000006Europe/Moscow 2016, 11:41:04

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132