Ответ 1
Обновление: исправленный алгоритм рендеринга карты, добавлено больше иллюстраций, изменено формирование.
Возможно, преимущество для метода "зигзагообразного" для отображения плиток на экран можно сказать, что координаты плитки x
и y
находятся на вертикальной и горизонтальной осях.
"Рисование в алмазном" подходе:
Нарисуя изометрическое отображение, используя "рисунок в бриллианте", который, как я полагаю, относится только к рендерингу карты с помощью вложенного for
-loop над двумерным массивом, такого как этот пример:
tile_map[][] = [[...],...]
for (cellY = 0; cellY < tile_map.size; cellY++):
for (cellX = 0; cellX < tile_map[cellY].size cellX++):
draw(
tile_map[cellX][cellY],
screenX = (cellX * tile_width / 2) + (cellY * tile_width / 2)
screenY = (cellY * tile_height / 2) - (cellX * tile_height / 2)
)
Преимущество:
Преимущество подхода заключается в том, что он представляет собой простой вложенный for
-loop с довольно прямой логикой, которая работает последовательно во всех фрагментах.
Неудобство:
Один недостаток этого подхода состоит в том, что координаты x
и y
плиток на карте будут увеличиваться по диагональным линиям, что может затруднить визуальное отображение местоположения на экране на карту, представленную как массив:
Однако для реализации вышеприведенного примера будет ошибка: порядок рендеринга приведет к тому, что плитки, которые должны быть за некоторыми плитами, будут нарисованы поверх плиток впереди:
Чтобы исправить эту проблему, внутренний порядок for
-loop должен быть отменен - начиная с самого высокого значения и отбрасывая в сторону более низкого значения:
tile_map[][] = [[...],...]
for (i = 0; i < tile_map.size; i++):
for (j = tile_map[i].size; j >= 0; j--): // Changed loop condition here.
draw(
tile_map[i][j],
x = (j * tile_width / 2) + (i * tile_width / 2)
y = (i * tile_height / 2) - (j * tile_height / 2)
)
С приведенным выше исправлением рендеринг карты следует скорректировать:
Подход "Зигзаг":
Преимущество:
Возможно, преимущество подхода "зигзагообраз" заключается в том, что отображаемая карта может казаться чуть более вертикально компактной, чем "алмазный" подход:
Неудобство:
Из попыток реализовать зигзагообразную технику недостатком может быть то, что писать код рендеринга немного сложнее, потому что он не может быть написан так же просто, как вложенный for
-loop над каждым элементом массива
tile_map[][] = [[...],...]
for (i = 0; i < tile_map.size; i++):
if i is odd:
offset_x = tile_width / 2
else:
offset_x = 0
for (j = 0; j < tile_map[i].size; j++):
draw(
tile_map[i][j],
x = (j * tile_width) + offset_x,
y = i * tile_height / 2
)
Кроме того, может быть немного сложно попытаться определить координату плитки из-за шахматного характера порядка рендеринга:
Примечание. Иллюстрации, включенные в этот ответ, были созданы с реализацией Java в представленном коде рендеринга плитки со следующим массивом int
в качестве карты:
tileMap = new int[][] {
{0, 1, 2, 3},
{3, 2, 1, 0},
{0, 0, 1, 1},
{2, 2, 3, 3}
};
Изображения в виде плитки:
-
tileImage[0] ->
Ящик с коробкой внутри. -
tileImage[1] ->
Черный ящик. -
tileImage[2] ->
Белый ящик. -
tileImage[3] ->
Ящик с высоким серым объектом в нем.
Замечание о ширинах и высотах плитки
Переменные tile_width
и tile_height
, которые используются в приведенных выше примерах кода, относятся к ширине и высоте земной плитки в изображении, представляющем плитку:
Использование размеров изображения будет работать, если размеры изображения и размеры плитки совпадают. В противном случае карта плитки может быть отображена с зазорами между плитами.