image.png1,7 Мб, 1080x951
Нормальная реализация системы энтити Hotchkiss # OP 974679 В конец треда | Веб
Пишу свой движок на крестах, дошла очередь до реализации системы создания сущностей. Что я хочу получить по итогу:

1) регистрируем сущность где-нибудь при начальной загрузке
2) Вв момент истины пишем auto EntPtr* = CreateEntityByName("classname");
3)profit, в auto получаем сразу указатель на класс-энтити нужного типа

То, до чего я додумался сам - работает без нареканий, но возвращает только указатели базового типа сущностей, от которого все наследуются. Получается, что для адекватной работы с этим указателем в дальнейшем приходится вручную приводить его под нужный тип данных, а это исключает возможность создавать энтити автоматически, зная только их класс-нейм. Очень надеюсь, что тут есть разумисты, которые уже сталкивались с такой проблемой.
2 974680
>>4679 (OP)

>CreateEntityByName("classname");


>указатель на класс-энтити нужного типа


Зачем тебе это нужно, лол?
https://ru.wikipedia.org/wiki/Проблема_XY

Опиши, зачем тебе нужна эта фича.
Как она будет тобой использоваться?
Как можно было бы обойтись без неё?
Почему именно эта фича, а не другая?

Алсо, в этом разделе мало движкопись.
3 974682
>>4680
Я очень хочу сохранить исходный тип, чтобы не превращать всё в пайтон. Если все сущности будут иметь тип BaseEntity* вне зависимости от их наполнения, то при работе с ними надо будет каждый раз проверять, что мы получили, и можно ли с этим что-то сделать
4 974683
>>4680
Вопрос про другую фичу странный, потому что то, что я пишу - это буквально базовое API движка.
Каждое энтити - это класс в коде, который обязательно наследуется от базового. На этапе регистрации мы соотносим пользовательский класснейм с функцией-фабрикой, которая создаёт на куче новый объект нужного типа, переводит указатель в тип BaseEntity*, и возвращает его
sage 5 974685
>>4679 (OP)
А зачем тебе знать конкретный тип? Уровню где ты объекты создаёшь не должно быть до этого дела. Объекты как то дальше сами должны всё разруливать, если у тебя ООП. И имя скорее всего ссылается на какие то настраиваемые руками данные, описывающие что ты вообще создаёшь.
sage 6 974686
>>4683
Для такого расклада имя прячется, делается шаблон вроде CreateObject<Type>(), в Type должно бысть статическое поле с именем/guid'ом или ещё чем. Получается что тип приводишь не ты и шансов получить жирный косяк минимальные. По другому никак не сделать.
7 974687
>>4686
Такое не проканает, потому что все шаблоны раскрываются на этапе компиляции, и получается, что невозможно создать сущность на лету по поступившим в рантайме данным. Например, если мы загружаем карту, в которой записаны класснеймы и атрибуты сущностей.
sage 8 974688
>>4687
Тогда тебе и не нужен конкретный класс. У тебя условно говоря есть фабрика берущая имя плюс атрибуты и возвращающая объект. У тебя просто негде это класс использовать. Если же до него надо добираться позже из кода то придётся реализовывать свой RTTI.
9 974689
>>4688
То есть ты предлагаешь все атрибуты и кастомные функции дочерних классов сущностей хранить в какой-гибудь самописной смешной структуре? Тогда получится, что непосредственно в коде у нас только один класс, и проблема в принципе решится
sage 10 974690
>>4689
Абсолютно не так. Ты просто можешь сделать примерно так baseObject->Cast<Foo>(), вернёт указатель если это реально Foo и nullptr если нет. В любом движке так и делается.
11 974691
>>4690
Спасибо, пойду пробовать
978-9785575dankq-memes-qanon-soothingmusicstream-pepe-wwg1wga-awoo-maga.jpg125 Кб, 820x551
12 974700
Эм... можно для тупых пояснить зачем может понадобиться в движке "система реализации создания сущностей по класснейму который передается строчкой с именем класса"?

>>4682

>то при работе с ними надо будет каждый раз проверять, что мы получили, и можно ли с этим что-то сделать


Ты как вообще это представляешь? У тебя допустим есть движок, который обрабатывает какую-то игру. Игра задана как последовательность комманд - "сначала двигаем игрока, потом проходим по массиву с пулями, потом двигаем НПЦ и т.п. и т.д."

В каком месте там может получиться "а ну там объект другого типа в списке, поэтому сегфолт так как я не знаю что такое интерфейс (и про ексепшоны тоже не слышал)"?

Я просто маленько динозавр в этом деле и не врубаюсь где там в логике работы вообще может возникнуть самодеятельность уровня "нам надо канпилятр песать" не говоря уже про то что есть луа как минимум
13 974707
>>4679 (OP)
Взять юнити или анрил

> а это исключает возможность создавать энтити автоматически, зная только их класс-нейм


Поч?
И ваще через темплейт можешь фабрику сделать
= CreateEntity<MyType>();
14 974708
>>4679 (OP)
Взять юнити или анрил

> а это исключает возможность создавать энтити автоматически, зная только их класс-нейм


Поч?
И ваще через темплейт можешь фабрику сделать
= CreateEntity<MyType>();
15 975168
>>4679 (OP)
а зачем создавать движок с нуля? что ты хочешь достичь, чего уже нет в U/UE?
Обновить тред
« /gd/В начало тредаВеб-версияНастройки
/a//b//mu//s//vg/Все доски

Скачать тред только с превьюс превью и прикрепленными файлами

Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах.Подробнее