Разделение логики игры и рендеринга

Каков наилучший способ отделить код рендеринга от собственно игрового движка / логического кода? И это даже хорошая идея, чтобы отделить их?

Давайте предположим, что у нас есть игровой объект под названием Рыцарь. Рыцарь должен быть отображен на экране, чтобы пользователь мог его увидеть. Теперь у нас есть два варианта. Либо мы даем рыцарю Render/Draw метод, который мы можем вызвать, или мы создаем класс рендерера, который заботится о рендеринге всех рыцарей.

В сценарии, где эти двое разделены, Рыцарь должен все еще содержать всю информацию, необходимую для его визуализации, или это тоже должно быть разделено?

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

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

3 ответа

Решение

Я бы постарался сделать ваши объекты как можно более общими и избегать как можно большего количества кодирования фактов игрового процесса в вашем коде.

Например, у вас есть класс Entity, Object или Actor, и у этого класса есть указатель на его принятие решений (его AI) и указатель на его графическое представление.

Принятие решения обязательно связано с фактами геймплея; действительно, это часть игрового процесса. Так что это где-то, где вы могли бы назвать вашего лица, принимающего решения "KnightAi" или что-то в этом роде

С другой стороны, графическое представление - это просто немного графики. Он будет нарисован так же, как и любой другой объект. У вас есть модель или несколько растровых изображений и некоторые анимации или нет... Это можно / можно просто назвать как-то как "Модель" и будет загружать информацию, которая, как ей говорят, загружает, определяет, как выглядит сущность для игрока. Когда дело доходит до того, что ваш рыцарь сравнивается с лошадью и замком, вы, скорее всего, обнаружите, что все они делают одно и то же только с разными данными. Виды данных, которые они имеют, даже одинаковы, просто различное содержимое.

Скажем, ваши сущности были представлены в виде кругов. Вы бы просто попросили их указать на CircleRenderer, который принял размер, который они должны быть нарисованы. Вы не создали бы другой класс рендерера для каждого разного размера (или цвета, или чего-либо другого) желаемого круга!

Я бы создал отдельный KnightRenderer учебный класс. Преимущества:

  • Чистое разделение между игровой логикой и рендерингом. Knight сам может даже работать на игровом сервере и вообще ничего не знать о рендеринге.
  • Меньшие, более простые классы, связанные с одним-единственным функционалом.

Все KnightRenderer нужно знать о Knight (должность, статус) должен быть публично читаемым в Knight,

Свойства, специфичные для рендеринга, будут KnightRenderer учебный класс. Например, может быть, вы хотите, чтобы рыцарь вспыхнул, когда его ударили, поэтому вам нужно будет сохранить счетчик или значение времени.

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

Я не настоящий эксперт, но вот как я вижу правильное разделение интересов:
http://aurelienribon.wordpress.com/2011/04/26/logic-vs-render-separation-of-concerns/

альтернативный текст

Другие вопросы по тегам