24 декабря 2023 г. Архивач восстановлен после серьёзной аварии. К сожалению, значительная часть сохранённых изображений и видео была потеряна. Подробности случившегося. Мы призываем всех неравнодушных помочь нам с восстановлением утраченного контента!

Нормальная реализация системы энтити

 Hotchkiss OP 17/09/24 Втр 10:40:25 #1 №974679 
image.png
Пишу свой движок на крестах, дошла очередь до реализации системы создания сущностей. Что я хочу получить по итогу:

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

То, до чего я додумался сам - работает без нареканий, но возвращает только указатели базового типа сущностей, от которого все наследуются. Получается, что для адекватной работы с этим указателем в дальнейшем приходится вручную приводить его под нужный тип данных, а это исключает возможность создавать энтити автоматически, зная только их класс-нейм. Очень надеюсь, что тут есть разумисты, которые уже сталкивались с такой проблемой.
Аноним 17/09/24 Втр 10:51:34 #2 №974680 
>>974679 (OP)
>CreateEntityByName("classname");
>указатель на класс-энтити нужного типа
Зачем тебе это нужно, лол?
https://ru.wikipedia.org/wiki/Проблема_XY

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

Алсо, в этом разделе мало движкопись.
Аноним 17/09/24 Втр 10:54:06 #3 №974682 
>>974680
Я очень хочу сохранить исходный тип, чтобы не превращать всё в пайтон. Если все сущности будут иметь тип BaseEntity* вне зависимости от их наполнения, то при работе с ними надо будет каждый раз проверять, что мы получили, и можно ли с этим что-то сделать
Аноним 17/09/24 Втр 10:58:42 #4 №974683 
>>974680
Вопрос про другую фичу странный, потому что то, что я пишу - это буквально базовое API движка.
Каждое энтити - это класс в коде, который обязательно наследуется от базового. На этапе регистрации мы соотносим пользовательский класснейм с функцией-фабрикой, которая создаёт на куче новый объект нужного типа, переводит указатель в тип BaseEntity*, и возвращает его
sage[mailto:sage] Аноним 17/09/24 Втр 11:02:35 #5 №974685 
>>974679 (OP)
А зачем тебе знать конкретный тип? Уровню где ты объекты создаёшь не должно быть до этого дела. Объекты как то дальше сами должны всё разруливать, если у тебя ООП. И имя скорее всего ссылается на какие то настраиваемые руками данные, описывающие что ты вообще создаёшь.
sage[mailto:sage] Аноним 17/09/24 Втр 11:06:25 #6 №974686 
>>974683
Для такого расклада имя прячется, делается шаблон вроде CreateObject<Type>(), в Type должно бысть статическое поле с именем/guid'ом или ещё чем. Получается что тип приводишь не ты и шансов получить жирный косяк минимальные. По другому никак не сделать.
Аноним 17/09/24 Втр 11:08:44 #7 №974687 
>>974686
Такое не проканает, потому что все шаблоны раскрываются на этапе компиляции, и получается, что невозможно создать сущность на лету по поступившим в рантайме данным. Например, если мы загружаем карту, в которой записаны класснеймы и атрибуты сущностей.
sage[mailto:sage] Аноним 17/09/24 Втр 11:11:53 #8 №974688 
>>974687
Тогда тебе и не нужен конкретный класс. У тебя условно говоря есть фабрика берущая имя плюс атрибуты и возвращающая объект. У тебя просто негде это класс использовать. Если же до него надо добираться позже из кода то придётся реализовывать свой RTTI.
Аноним 17/09/24 Втр 11:13:31 #9 №974689 
>>974688
То есть ты предлагаешь все атрибуты и кастомные функции дочерних классов сущностей хранить в какой-гибудь самописной смешной структуре? Тогда получится, что непосредственно в коде у нас только один класс, и проблема в принципе решится
sage[mailto:sage] Аноним 17/09/24 Втр 11:16:19 #10 №974690 
>>974689
Абсолютно не так. Ты просто можешь сделать примерно так baseObject->Cast<Foo>(), вернёт указатель если это реально Foo и nullptr если нет. В любом движке так и делается.
Аноним 17/09/24 Втр 11:20:24 #11 №974691 
>>974690
Спасибо, пойду пробовать
Аноним 17/09/24 Втр 13:00:34 #12 №974700 
978-9785575dankq-memes-qanon-soothingmusicstream-pepe-wwg1wga-awoo-maga.jpg
Эм... можно для тупых пояснить зачем может понадобиться в движке "система реализации создания сущностей по класснейму который передается строчкой с именем класса"?

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

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

Я просто маленько динозавр в этом деле и не врубаюсь где там в логике работы вообще может возникнуть самодеятельность уровня "нам надо канпилятр песать" не говоря уже про то что есть луа как минимум
Аноним 17/09/24 Втр 13:33:39 #13 №974707 
>>974679 (OP)
Взять юнити или анрил
> а это исключает возможность создавать энтити автоматически, зная только их класс-нейм
Поч?
И ваще через темплейт можешь фабрику сделать
= CreateEntity<MyType>();
Аноним 17/09/24 Втр 13:34:07 #14 №974708 
>>974679 (OP)
Взять юнити или анрил
> а это исключает возможность создавать энтити автоматически, зная только их класс-нейм
Поч?
И ваще через темплейт можешь фабрику сделать
= CreateEntity<MyType>();
Аноним 20/09/24 Птн 00:27:20 #15 №975168 
>>974679 (OP)
а зачем создавать движок с нуля? что ты хочешь достичь, чего уже нет в U/UE?
comments powered by Disqus

Отзывы и предложения