Реализация паттерна Entity-Component-System09.10.2018, 18:00. Показов 3148. Ответов 5
Метки нет (Все метки)
Возникло желание попробовать реализовать паттерн Entity-Component-System. Изрядно начитавшись статей я взялся за дело.
Сначала я реализовал такую архитектуру: Абстрактный класс IEntity хранит в себе массив указателей абстрактного класса IComponent, который в свою очередь хранит указатель на сущность, которой принадлежит. Это создало перекрёстное наследование (вроде так называется), но об этом позже. Есть класс Level, от которого наследуются уровни. Сам класс хранит в себе массив указателей IEntity (ObjectList) и массив указателей IComponent (DrawableList). Сама сущность создаётся следующим образом:
Спустя время обдумывания я пришёл к немного изменённой архитектуре (Диаграмма классов прикреплена ниже) Я решил сделать акцент на том, что у сущностей и компонентов всё таки есть айдишники, которые я до этого почти не использовал. Я решил что массив сущностей будет храниться только в одном месте — в EntityManager, а в остальных местах только айдишники. Как это должно работать: Есть статический класс EntityManager, который может создавать и удалять сущности. Делать это может только он (конструктор и деструктор IEntity стали приватными, а EntityManager стал дружественным). Имеется метод Create, который возвращает объект *IEntity и добавляет его в массив
Сущности же в свою очередь теперь имеют массив айдишников компонентов. Например, чтобы удалить компонент с именем Sprite я делаю так:
Дабы решить эту проблему был соблазн обмазаться шаблонами, но мне хотелось бы обойтись без них (ну просто не хочу и всё). Но даже с ними у меня не получилось (хотя в другом проекте похожая реализация у меня работала, но я не смог её найти).
Я не исключаю того, что могу не знать многих вещей, или попросту того что я что-то забыл. Хотелось бы услышать критику и советы по поводу реализации
0
|
||||||||||||||||||||||||||
| 09.10.2018, 18:00 | |
|
Ответы с готовыми решениями:
5
Собственная реализация паттерна "Слушатель" - нужна конструктивная критика System.UnauthorizedAccessException: Creating an instance of the COM component with CLSID {...} from the IClassFactory failed due to the following erro Entity Component System, можно ли доработать класс Entity |
|
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
|
||||
| 09.10.2018, 22:50 | ||||
IEntity - это интерфейс (буковка I - намекает об этом). Создаваться должен именно наследник.Придется запрограммировать способ, с помощью которого EntityManager, а по сути - фабрика, сможет научиться создавать объекты наследников IEntity. Например, можно завести метод void EntityManager::Register(const std::string &name, FactoryMethod createMethod) в котором выполнять регистрацию методов создания конкретных наследников.dynamic_cast у вас здесь категорически не нужен.Добавлено через 2 часа 51 минуту Если вы сделали подобный вывод глядя на реализацию, которую приводят обычно как иллюстрацию паттерна, то спешу вас уведомить, что данная реализация ни в коем случае не является эталоном. Тот или иной паттерн всегда применим к конкретной проблеме, которая всегда накладывает свои ограничения. Идея, заложенная в паттерне, должна помочь выстроить архитектуру, а не навязывать конкретную реализацию как шаблон. Т.е., проще говоря, паттерном является именно идея, а никак не реализация. Реализацию определяет программист исходя из своей конкретной задачи.
0
|
||||
| 10.10.2018, 17:32 [ТС] | ||||||||||||||||||
|
В EntityManager я добавил коллекцию для зарегистрированных методов, сам метод регистрации, и слегка изменил метод Create
Правда мне не очень нравится держать метод EObject::create в public (пока не придумал куда можно впихнуть регистрацию метода так, чтобы он оставался приватным) Я правильно понял вашу идею?
0
|
||||||||||||||||||
|
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
|
||||||||||
| 10.10.2018, 18:15 | ||||||||||
Сообщение было отмечено avraal как решение
Решениеreinterpret_cast?Вообще очень много красоты в эту систему можно добавить, если сделать кое-что через шаблоны. Например метод Register сделать шаблонным, и наделить его возможностью самостоятельно искать "создателя" у переданного типа. Пример: Кликните здесь для просмотра всего текста
find - и проверку на end(), т.к. при неправильном имени TypeName бедует создаваться элемент map по умолчанию - нулевой указатель на функцию. std::make_pair. А в последних версия языка вообще можно написать RegisteredMethods.insert({ name, creator });.В целом - да, идею верно поняли.
2
|
||||||||||
|
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
|
|
| 06.11.2018, 15:39 | |
|
Не по теме: DrOffset, эхх.. вот бы еще от вас увидеть реализацию зы - за ап темы извиняюсь, но уж очень интересны некоторые моменты.
0
|
|
|
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
|
|
| 07.11.2018, 20:31 | |
|
Azazel-San, Да, конечно, чуть попозже смогу показать.
1
|
|
| 07.11.2018, 20:31 | |
|
Помогаю со студенческими работами здесь
6
Реализация паттерна состояние Реализация паттерна MVC
Реализация паттерна MVP в Windows Forms Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение.
И на уровне агентов добавится между грибами или бактериями взаимодействий.
До того я пробовал подход через многомерные массивы,. . .
|
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Сочетание глобально распределённой вычислительной мощности и инновационных. . .
|
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Налог на собак: https:/ / **********/ gallery/ V06K53e
Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf
Пост отсюда. . .
|
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop?
Ниже её машинный перевод.
После долгих разбирательств я наконец-то вернула себе. . .
|
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод
Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод.
Thinkpad X220 Tablet —. . .
|
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|