Разработка 2D-игры, и я хочу отделить игровой движок от графики. Я решил использовать модельный шаблон вида следующим образом: игровой движок владеет объектами игры (EnemyModel, BulletModel, ExplosionModel), которые реализуют интерфейсы (Enemy, Bullet, Explosion).Смешанный компонентный дизайн и модельный вид (-контроллер)
View принимает события при создании сущностей, получая указатель на интерфейс: таким образом View может использовать только методы интерфейса (т. Е. Запрашивать информацию для выполнения чертежа) и не может изменять состояние объекта. В представлении есть свои onw-классы (EnemyView, BulletView, ExplosionView), которые владеют указателями на интерфейсы. (Существует также шаблон, основанный на событии, так что Модель может уведомить об изменении сущности, поскольку метод чистого запроса является неприменимым, но я не буду обсуждать его здесь).
* В классах моделей используется компонентный компонент компиляции: они используют библиотеку boost :: fusion для хранения различных компонентов состояния, таких как PositionComponent, HealthComponent и т. Д.
В настоящий момент View не осведомлен о конструкции на основе компонентов, а только о части модели: чтобы получить позицию врага, он вызывает метод Enemy :: get_xy(). EnemyModel, который реализует интерфейс, перенаправляет этот вызов в PositionComponent и возвращает результат.
Поскольку у пули тоже есть позиция, я должен добавить метод get_xy в Bullet. BulletModel использует ту же реализацию, что и класс EnemyModel (т. Е. Перенаправляет вызов).
Этот аспект затем приводит к тому, что у него много дублирующего кода: интерфейсы имеют много похожих методов и * классы моделей полны форвардных методов.
Так что я в основном два варианта:
1) разоблачить дизайн, основанный compoment так, что каждый компонент имеет интерфейс, а также: взгляд может использовать этот интерфейс для прямого запроса компонента. Он сохраняет раздел «Вид» и «Модель» разделенными только на уровне компонента вместо уровня сущности.
2) Отклонитесь от части обзора модели и перейдите на чистый компонентный дизайн: вид - это только компонент (часть RenderableComponent), которая имеет в основном полный доступ к движку игры.
Основываясь на вашем опыте, какой подход был бы лучше всего?
HMVC - это действительно какая-то чушь, составленная кем-то, кто хотел использовать наследование, чтобы делиться множеством кода и не переписывать или копировать и вставлять файлы. В противном случае я соглашаюсь с вашими замечаниями относительно сущностных систем, которые хорошо подходят для игр. Игры должны обрабатывать прерывания, такие как функции, предлагаемые в UnRealScript, которые позволяют программисту говорить «делать это каждые 2 секунды в реальном времени». Для формального лечения прерываний, прочитайте Грэм Хаттон. Что означает все эти перерывы? (для Haskell). – user429921
Если HMVC только уменьшает дублированный код, это уже хорошо. С моей точки зрения, это хорошо, только для компонентов (или чего-то, что ведет себя как компонент, который вы можете потерять в пользовательском интерфейсе без дальнейшей работы). Строгий HMVC (проходящий только через контроллеры) в значительной степени похож на несколько проектов MVC. – Wernight
Я думаю, что это просто вопрос технического искажения от вашего имени. Исходное описание HMVC не использует передачу только через контроллеры. Основное различие между HMVC и PAC заключается в том, что в PAC вы проходите только через контроллеры, а просмотры и модели не могут разговаривать напрямую друг с другом. Я также думаю, что концептуально неправильно говорить, что HMVC «в значительной степени напоминает несколько проектов MVC», поскольку повторное использование знаний домена не может быть бесплатным. Реальные системы не могут быть скомпилированы бесплатно и могут иметь взаимоблокировки, livelocks, прерывания обслуживания, мешающие спецификациям в реальном времени и т. Д. – user429921