Я думаю, что я уже получил идею Системы Entity, вдохновленной Адамом Мартином (T-Machine). Я хочу начать использовать это для моего следующего проекта.
Я уже знаю основы сущности, компонентов и систем. Моя проблема заключается в том, как обрабатывать интерфейс / HUD. Например, окно квестов, окно навыков, окно информации о персонаже и т. Д. Как вы обрабатываете события пользовательского интерфейса (например, нажатие кнопки)? Это вещи, которые не нужно обрабатывать каждый кадр. В настоящее время я использую MVC для кодирования пользовательского интерфейса, но я не думаю, что это будет совместимо с Entity System.
Я читал, что Entity System встроена в большую ООП. Я не знаю, находится ли пользовательский интерфейс вне ES или нет. Как мне подойти к этому?
источник
Хотя я думаю, что интерфейс Entity / Component мог бы работать, было бы трудно сделать это так. Кроме того, он достаточно далеко удален от компонентов и систем, которые у вас есть для обработки игровых сущностей, по сути, это будет просто другая сущность / система компонентов в вашей игре. Я не могу себе представить, что между ними будет много совпадений.
Системы сущностей потрясающие, и может быть заманчиво использовать их повсюду. В конце концов, когда вы получаете действительно сладкий молоток, вы испытываете желание относиться ко всем своим проблемам, как к гвоздям. Однако система EC - это просто еще один инструмент в вашей сумке для программирования. Для задач, которые он использует для решения, он работает очень хорошо, но у вас есть лучшие инструменты для таких задач, как пользовательский интерфейс.
Структура наследования работает очень хорошо для GUI. Не только для создания компонентов пользовательского интерфейса, но и для их размещения. Приятно иметь возможность, чтобы компоненты пользовательского интерфейса были дочерними по отношению к другим компонентам, чтобы они могли наследовать такие свойства, как положение, масштаб и непрозрачность. Если вы попытаетесь настроить это с помощью системы EC, вам придется нарушить некоторые правила системы EC.
источник
Вы можете создать новую интерфейсную функцию, которая вызывается всякий раз, когда рисуется UI / HUD, и разрешать пользовательским / скриптовым компонентам реализовывать эту функцию. Для этого необходимо использовать систему IMGUI (в Google есть много обучающих программ, это просто оригинальная презентация). При этом вы можете создавать окна как сущности, внутри которых вы будете иметь свой собственный компонент построения пользовательского интерфейса и компонент визуализации оконной рамы.
Что касается не обработки всего этого каждого кадра, вы можете отобразить весь пользовательский интерфейс в другом буфере, который вы будете обновлять только для всех видов событий ввода / данных. Таким образом, всякий раз, когда событие получено, оно изменяет некоторую переменную, чтобы указать, что окно должно быть перекрашено в следующем кадре. Если эта переменная имеет значение true, тогда она устанавливается на false и после этого вызываются интерфейсы пользовательского интерфейса. Если вам нужны анимации, важно использовать именно такой порядок операций, чтобы сам пользовательский интерфейс мог инициировать перерисовку для следующего кадра.
источник