Как кодировать UI / HUD в Entity System?

18

Я думаю, что я уже получил идею Системы Entity, вдохновленной Адамом Мартином (T-Machine). Я хочу начать использовать это для моего следующего проекта.

Я уже знаю основы сущности, компонентов и систем. Моя проблема заключается в том, как обрабатывать интерфейс / HUD. Например, окно квестов, окно навыков, окно информации о персонаже и т. Д. Как вы обрабатываете события пользовательского интерфейса (например, нажатие кнопки)? Это вещи, которые не нужно обрабатывать каждый кадр. В настоящее время я использую MVC для кодирования пользовательского интерфейса, но я не думаю, что это будет совместимо с Entity System.

Я читал, что Entity System встроена в большую ООП. Я не знаю, находится ли пользовательский интерфейс вне ES или нет. Как мне подойти к этому?

Sylpheed
источник

Ответы:

17

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

Возможно, если вы отделите свой пользовательский интерфейс, это будет намного лучше и проще. Вам не нужно делать ВСЕ в области сущностей.

Густаво Масиэль
источник
Это также то, что Адам Мартин говорит в одном из своих постов или комментариев на t-machine. ЭС является решением для конкретной проблемы. Его можно и нужно использовать вместе с более «традиционными» решениями для других аспектов игры (движка).
user8363
Спасибо. Я просто не уверен, что должно быть в ES. Итак, как вы кодируете эффективный интерфейс? Я думаю, что MVC не сокращает это, потому что у меня есть проблемы с иерархией.
Сильфида
Я вижу, вы согласны использовать другую архитектуру для пользовательского интерфейса. Тогда в чем проблема с MVC?
Нарек
У @Armen MVC нет проблем, но если поместить его в область действия сущностей, то это так. Просто его преимущества не превзойдут его недостатки. Там нет необходимости быть астронавтом архитектуры
Густаво Масиэль
3

Хотя я думаю, что интерфейс Entity / Component мог бы работать, было бы трудно сделать это так. Кроме того, он достаточно далеко удален от компонентов и систем, которые у вас есть для обработки игровых сущностей, по сути, это будет просто другая сущность / система компонентов в вашей игре. Я не могу себе представить, что между ними будет много совпадений.

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

Структура наследования работает очень хорошо для GUI. Не только для создания компонентов пользовательского интерфейса, но и для их размещения. Приятно иметь возможность, чтобы компоненты пользовательского интерфейса были дочерними по отношению к другим компонентам, чтобы они могли наследовать такие свойства, как положение, масштаб и непрозрачность. Если вы попытаетесь настроить это с помощью системы EC, вам придется нарушить некоторые правила системы EC.

MichaelHouse
источник
1

Вы можете создать новую интерфейсную функцию, которая вызывается всякий раз, когда рисуется UI / HUD, и разрешать пользовательским / скриптовым компонентам реализовывать эту функцию. Для этого необходимо использовать систему IMGUI (в Google есть много обучающих программ, это просто оригинальная презентация). При этом вы можете создавать окна как сущности, внутри которых вы будете иметь свой собственный компонент построения пользовательского интерфейса и компонент визуализации оконной рамы.

Что касается не обработки всего этого каждого кадра, вы можете отобразить весь пользовательский интерфейс в другом буфере, который вы будете обновлять только для всех видов событий ввода / данных. Таким образом, всякий раз, когда событие получено, оно изменяет некоторую переменную, чтобы указать, что окно должно быть перекрашено в следующем кадре. Если эта переменная имеет значение true, тогда она устанавливается на false и после этого вызываются интерфейсы пользовательского интерфейса. Если вам нужны анимации, важно использовать именно такой порядок операций, чтобы сам пользовательский интерфейс мог инициировать перерисовку для следующего кадра.

snake5
источник