Оновлення: виправлений алгоритм візуалізації карти, додано більше ілюстрацій, змінено форматування.
Можливо, перевагою техніки «зигзаг» для відображення плиток на екрані можна сказати, що плитки x
та y
координати розташовані на вертикальній та горизонтальній осях.
Підхід "малювання в ромбі":
Намалювавши ізометричну карту за допомогою "малювання в ромбі", що, на мою думку, стосується просто рендеринга карти за допомогою вкладеної for
петлі над двовимірним масивом, наприклад на цьому прикладі:
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
коло з досить прямою логікою вперед, яке стабільно працює на всіх плитках.
Недолік:
Один недолік цього підходу полягає в тому, що x
і y
координати плитки на карті буде збільшуватися в діагональних ліній, які могли б зробити його більш важко візуально відобразити розташування на екрані на карті , представленої в вигляді масиву:
Однак реалізація вищевказаного коду має бути хиткою - наказ відтворення призведе до того, що плитки, які повинні бути за певними плитками, будуть намальовані зверху на плитках спереду:
Щоб виправити цю проблему, порядок внутрішнього for
циклу необхідно змінити - починаючи з найвищого значення та переходячи до нижчого значення:
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)
)
За допомогою наведеного вище виправлення відображення карти слід виправити:
"Зігзаг" підхід:
Перевага:
Можливо, перевага "зигзагу" підходу полягає в тому, що відображена карта може здатися трохи більш вертикально компактною, ніж "алмазний" підхід:
Недолік:
Не намагаючись реалізувати техніку zig-zag, недоліком може бути те, що писати код візуалізації трохи складніше, тому що він не може бути записаний так просто, як вкладений for
цикл над кожним елементом масиву:
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
використовувані у наведених вище прикладах коду стосуються ширини та висоти основної плитки на зображенні, що представляє плитку:
Використання розмірів зображення буде працювати, доки розміри зображення та розміри плитки збігаються. В іншому випадку карта плитки може бути відображена з проміжками між плитками.