Проблема сортировки изометрической глубины с большими объектами

В настоящее время я создаю изометрическую игру as3, но у меня большие проблемы с сортировкой по глубине. Я искал решение, но не нашел ничего, что соответствовало бы моей проблеме (прямоугольные объекты).

Вот скриншот моей игры:

введите здесь описание изображения

Как видите, сортировка по глубине хорошо работает, когда она находится между объектами тайлов 1x1. Я просто использую их координаты x и y (относительно изометрической карты), чтобы отсортировать их.

Проблема возникает, когда у меня есть большие объекты, например 2x2, 1x4 или 4x1.

Любая идея, как мне тогда обрабатывать сортировку по глубине?


person Sanchex    schedule 23.06.2012    source источник


Ответы (2)


Я не думаю, что можно отсортировать сцену на основе одного значения x,y для каждого объекта, если некоторые из них могут быть достаточно длинными, чтобы один конец находился на другой глубине, чем другой. Например, подумайте, как бы вы справились с визуализацией, если бы коричневый стул на вашем изображении был перемещен на один квадрат вниз влево (к квадрату между синим стулом и длинным диваном). Он будет глубже в сцене, чем красный стол за диваном, но его нужно будет визуализировать поверх дивана, который должен быть поверх стола.

Я думаю, что есть два простых решения:

  • Создавайте свои уровни, используя только один тип перекрытия для больших объектов. Например, вы можете указать, что глубина объекта основана на его ближайшем углу, что потребует от вас не помещать объекты перед его самыми удаленными частями (поскольку он будет отображаться поверх них). Или вы можете придерживаться своего текущего кода (который, кажется, использует самый дальний угол для глубины) и не размещать что-либо за ближайшими частями. Однако у вас могут возникнуть проблемы с персонажами и другими движущимися объектами. Вы можете сделать проблемные плитки недоступными, если будете осторожны с дизайном, но в некоторых случаях это может быть слишком ограничительным.
  • Разбейте большие объекты на более мелкие, которые будут иметь собственную глубину. Вы, вероятно, захотите сразу перейти к 1x1 фрагментам, каждый из которых будет иметь однозначную глубину. Вы можете оставить более крупные объекты в коде в качестве невидимых контейнеров для более мелких частей или полностью исключить их, в зависимости от того, что облегчит вам загрузку и взаимодействие с различными битами.

Разделение больших объектов на части размером 1x1 также может быть полезным, поскольку вы можете сделать их модульными. То есть вы можете строить объекты разного размера, соединяя 1x1 кусочка в разных комбинациях. Например, если вы разрезаете 2x1 таблиц на изображении пополам по вертикали и создаете среднюю плитку размером 1x1, которая помещается между ними, вы можете растянуть дизайн до 3x1 или 10x1, в зависимости от того, сколько раз вы повторяете среднюю плитку. Есть много других способов сделать мозаичную графику хорошо выглядящей с минимальными затратами искусства.

person Blckknght    schedule 23.06.2012
comment
Спасибо за Ваш ответ. Я, конечно, не могу работать с первым решением, так как это пользователь, который строит свое собственное казино. Я не могу ставить ему ограничения. Но второе решение кажется интересным, я попробую, посмотрим, смогу ли я заставить что-то работать. ;) - person Sanchex; 23.06.2012

Эмуляторы Ultima Online (в частности, POL, хотя могут быть и другие) достигают этого за счет реализации и использования концепции «мульти» — единого объекта, состоящего из секций нарезанной более крупной графики. Эта нарезанная графика такова, что ее спрайты разделены по вертикали в левых и правых угловых точках границ изосетки.

Другие соображения: - визуализировать "несколько" фрагментов, отсортированных по оси Y экрана сверху вниз. - южный (то есть нижний левый экран) компонент «мульти» становится якорной позицией плитки (в случае вашего дивана, его крайняя левая часть). - учтите, что каждая локация на карте также может содержать свой собственный вертикальный стек объектов; смещение рендеринга каждого объекта с помощью screen-Y имитирует высоту/высоту, и они должны быть отсортированы снизу вверх (например, от самой низкой высоты к самой высокой высоте).

Удачи!

person sws    schedule 19.09.2014