Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / Порядок отрисовки объектов на игровой сцене.

Порядок отрисовки объектов на игровой сцене.

Поделиться
BakuardПользовательwww2 апр. 201719:26#0
Доброго времени суток.

Делаю 2D RPG видом сверху (как в обычных jrpg). Удалось реализовать систему столкновений и процедурную генерацию мира. И вот застрял на следующем - в каком порядке выводить объекты на экран чтобы они правильно перекрывали друг друга. К чему я пока пришел: имеется карта модели и карта отображения. Карта модели используется для расчета столкновений и при генерации мира - когда решается где и какой объект будет находиться. Вначале для хранения карты модели я использовал 2D массив. Но когда появились объекты в форме арки, а в ландшафте летающие острова стал хранить карту модели в 3D массиве чтобы было проще рассчитывать столкновения. Карта отображения - обыкновенная тайловая карта хранящееся в 2D массиве. Проблема возникла в следующем: на карте есть объекты площадь которых занимает несколько тайлов. Некоторые объекты могут нависать над другими - например деревья над крышами низких домов. Сперва я просто хотел отсортировать все объекты в зависимости от их координаты Z и Y. Но что если одна часть объекта высокая, а другая низкая, например: двух этажный дом с крыльцом. В этом случае, если рядом с домом генерируется дерево то необходимо учитывать рядом с какой его частью оно появилось и уже потом решать - сможет ли листва дерева находится над этой частью дома или нет. Резать изображения на части по высоте, а уже потом сортировать - ну во первых хотелось бы облегчить работы художнику, а во вторых я не знаю как из этих частей потом собрать целое изображение. В общем пришёл к следующему решению - программно нарезать изображение на маленькие квадраты, каждый из которых размером с тайл карты отображения, а в модели хранить 2D массив каждого конкретного изображения - где в каждой ячейке массива находится информация о высоте соответствующей части изображения. Сам 2D массив формируется на основе 3D маски объекта используемой для расчета столкновений. Способ хоть и рабочий, но уж какой-то замудренный и кажется мне очень кривым. А какие способы вы бы посоветовали или можно ли как-то упростить мой подход?

P.s. интересует сам принцип, подход к решению задачи, а не реализация на том или ином движке.

gambit_ozПостоялецwww3 апр. 20178:52#1
Например можно применить сортировку объектов на экране в зависимости от их координат, а потом выводить отсортированное на экран. Можно ввести слои типа грунт, стены, крыша/деревья.
SuslikМодераторwww3 апр. 20179:29#2
Bakuard
при рендеринге удобнее мыслить не в терминах объектов, а в терминах тайлов. например, если объект "дом" состоит из нескольких тайлов, то их имеет смысл сортировать и рендерить как абсолютно независимые сущности, хотя они и являются по сути частью одного игрового объекта. далее, если тайлы имеют три координаты, то их нужно отрисовывать в том же порядке, в котором отрисовываются воксели — от дальних к ближним. таким образом, нужно отсортировать все тайлы по удалённости от камеры и рендерить от дальних к ближним.

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

проблемы с объектами, которые не разделены на тайлы, будут всегда. например, существа, которые движутся между тайлами недискретно. или если решишь рендерить объекты площадью больше одного тайла, не разрезав их. или объект неправильно разделён на тайлы. в таком случае всегда будут артефакты.

Правка: 3 апр. 2017 9:31

/ Форум / Программирование игр / 2D графика и изометрия

2001—2017 © GameDev.ru — Разработка игр