Я подошел к этому, чтобы иметь слой отображения, который ничего не знает о самом игровом мире. его единственная задача - получить упорядоченный список объектов для рисования на экране, которые все соответствуют унифицированному формату для графического объекта. так, например, если это 2D-игра, ваш дисплейный слой получит список изображений вместе с их коэффициентом масштабирования, непрозрачностью, вращением, отражением и исходной текстурой, а также с любыми другими атрибутами, которые может иметь экранный объект. Представление также может отвечать за получение высокоуровневых взаимодействий мыши с этими отображаемыми объектами и их отправку в подходящее место. Но важно, чтобы слой представления ничего не знал о том, что он отображает. Только то, что это какой-то квадрат с площадью поверхности и некоторыми атрибутами.
Затем следующим слоем вниз является программа, задачей которой является просто создать список этих объектов по порядку. Это полезно, если у каждого объекта в списке есть какой-то уникальный идентификатор, так как это делает возможными определенные стратегии оптимизации на уровне представления. Генерирование списка экранных объектов является гораздо менее сложной задачей, чем попытка выяснить для каждого типа персонажа, как он собирается физически отображать себя.
Z сортировка достаточно проста. Вашему экранному объекту, генерирующему код, просто нужно сгенерировать список в том порядке, в котором вы хотите, и вы можете использовать все необходимые средства, чтобы добраться до него.
В нашей программе отображения экранных объектов каждый персонаж, реквизит и NPC состоят из двух частей: помощника базы данных ресурсов и экземпляра символа. Помощник по базе данных представляет для каждого персонажа простой интерфейс, из которого каждый персонаж может получить любое изображение / статистику / анимацию / расположение и т. Д., Которые понадобятся персонажу. Возможно, вы захотите придумать довольно унифицированный интерфейс для извлечения данных, но он будет немного отличаться от объекта к объекту. Дерево или камень не нуждаются в таком количестве вещей, как, например, полностью анимированный NPC.
Тогда вам нужен какой-то способ генерации экземпляра для каждого типа объекта. Вы можете реализовать эту дихотомию, используя встроенные в ваш класс системы / экземпляры вашего языка, или, в зависимости от ваших потребностей, вам может потребоваться немного поработать над этим. например, каждая база данных ресурсов должна быть экземпляром класса базы данных ресурса, а каждый экземпляр символа является экземпляром класса «символа». Это избавляет вас от написания фрагмента кода для каждого маленького объекта в системе. Таким образом, вам нужно только написать код для широких категорий объектов и изменить только мелочи, например, из какой строки базы данных извлекать изображения.
Тогда не забудьте иметь внутренний объект, представляющий вашу камеру. Тогда ваша камера должна опрашивать каждого персонажа о том, где он находится по отношению к камере. В основном он обходит каждый экземпляр символа и запрашивает его экранный объект. "Как ты выглядишь и где ты?"
Каждый экземпляр персонажа, в свою очередь, имеет своего маленького помощника по работе с базами данных, который нужно запросить. Таким образом, каждый экземпляр персонажа имеет в своем распоряжении всю информацию, необходимую ему, чтобы сообщить камере то, что ему нужно знать.
Это оставляет вас с набором персонажей в мире, который более или менее забывает о мельчайших подробностях того, как они должны отображаться на физическом экране, и более или менее забывает о мельчайших подробностях того, как получить изображение данные с жесткого диска. Это хорошо - это дает вам как можно более чистый лист для своего рода платонически «чистого» мира персонажей, в котором вы можете реализовать свою игровую логику, не беспокоясь о таких вещах, как падение с края экрана. Подумайте, какой интерфейс вы бы хотели использовать, если бы в игровой движок вы добавили скриптовый язык. Как просто, не так ли? Как можно больше основано на моделируемом мире, не беспокоясь о технических деталях реализации, верно? Вот что позволяет вам эта стратегия.
Кроме того, разделение задач позволяет заменять слой дисплея любой технологией, которая вам нравится: Open GL, DirectX, программный рендеринг, Adobe Flash, Nintendo DS и т. Д. Без лишних хлопот с другими слоями.
Кроме того, вы можете поменять слой базы данных, чтобы сделать такие вещи, как изменение кожи всех персонажей - или, в зависимости от того, как вы его построили, поменять местами в совершенно новую игру с новым контентом, который повторно использует большую часть взаимодействий / столкновений персонажей. код обнаружения / поиска пути, который вы написали на среднем уровне.