М.Двач / Gamedev

Двач.hk не отвечает.
Вы видите копию треда, сохраненную 23 июня в 14:37.

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

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.

1,7 Мб, 1080x951
Нормальная реализация системы энтити Hotchkiss # OP 17 сен 2024, 10:40 974679 В конец треда | Веб

Пишу свой движок на крестах, дошла очередь до реализации системы создания сущностей. Что я хочу получить по итогу:

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

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

Ответы46804685470747085168

2 17 сен 2024, 10:51 2 974680

>>974679 (OP)
>CreateEntityByName("classname");
>указатель на класс-энтити нужного типа
Зачем тебе это нужно, лол?
https://ru.wikipedia.org/wiki/Проблема_XY

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

Алсо, в этом разделе мало движкопись.

Ответы46824683

3 17 сен 2024, 10:54 3 974682

>>974680
Я очень хочу сохранить исходный тип, чтобы не превращать всё в пайтон. Если все сущности будут иметь тип BaseEntity* вне зависимости от их наполнения, то при работе с ними надо будет каждый раз проверять, что мы получили, и можно ли с этим что-то сделать

Ответы4700

4 17 сен 2024, 10:58 4 974683

>>974680
Вопрос про другую фичу странный, потому что то, что я пишу - это буквально базовое API движка.
Каждое энтити - это класс в коде, который обязательно наследуется от базового. На этапе регистрации мы соотносим пользовательский класснейм с функцией-фабрикой, которая создаёт на куче новый объект нужного типа, переводит указатель в тип BaseEntity*, и возвращает его

Ответы4686

sage 5 17 сен 2024, 11:02 5 974685

>>974679 (OP)
А зачем тебе знать конкретный тип? Уровню где ты объекты создаёшь не должно быть до этого дела. Объекты как то дальше сами должны всё разруливать, если у тебя ООП. И имя скорее всего ссылается на какие то настраиваемые руками данные, описывающие что ты вообще создаёшь.

sage 6 17 сен 2024, 11:06 6 974686

>>974683
Для такого расклада имя прячется, делается шаблон вроде CreateObject<Type>(), в Type должно бысть статическое поле с именем/guid'ом или ещё чем. Получается что тип приводишь не ты и шансов получить жирный косяк минимальные. По другому никак не сделать.

Ответы4687

7 17 сен 2024, 11:08 7 974687

>>974686
Такое не проканает, потому что все шаблоны раскрываются на этапе компиляции, и получается, что невозможно создать сущность на лету по поступившим в рантайме данным. Например, если мы загружаем карту, в которой записаны класснеймы и атрибуты сущностей.

Ответы4688

sage 8 17 сен 2024, 11:11 8 974688

>>974687
Тогда тебе и не нужен конкретный класс. У тебя условно говоря есть фабрика берущая имя плюс атрибуты и возвращающая объект. У тебя просто негде это класс использовать. Если же до него надо добираться позже из кода то придётся реализовывать свой RTTI.

Ответы4689

9 17 сен 2024, 11:13 9 974689

>>974688
То есть ты предлагаешь все атрибуты и кастомные функции дочерних классов сущностей хранить в какой-гибудь самописной смешной структуре? Тогда получится, что непосредственно в коде у нас только один класс, и проблема в принципе решится

Ответы4690

sage 10 17 сен 2024, 11:16 10 974690

>>974689
Абсолютно не так. Ты просто можешь сделать примерно так baseObject->Cast<Foo>(), вернёт указатель если это реально Foo и nullptr если нет. В любом движке так и делается.

Ответы4691

11 17 сен 2024, 11:20 11 974691

>>974690
Спасибо, пойду пробовать

125 Кб, 820x551
12 17 сен 2024, 13:00 12 974700

Эм... можно для тупых пояснить зачем может понадобиться в движке "система реализации создания сущностей по класснейму который передается строчкой с именем класса"?

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

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

Я просто маленько динозавр в этом деле и не врубаюсь где там в логике работы вообще может возникнуть самодеятельность уровня "нам надо канпилятр песать" не говоря уже про то что есть луа как минимум

13 17 сен 2024, 13:33 13 974707

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

14 17 сен 2024, 13:34 14 974708

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

15 20 сен 2024, 00:27 15 975168

>>974679 (OP)
а зачем создавать движок с нуля? что ты хочешь достичь, чего уже нет в U/UE?

Обновить тред
Двач.hk не отвечает.
Вы видите копию треда, сохраненную 23 июня в 14:37.

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

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.

« /gd/В начало тредаВеб-версияНастройки/a//b//mu//s//vg/Все доски

Пользуетесь скринридером — пишите, что можно улучшить.
Host-Food.ru — надёжный хостинг от 12 руб/мес | Free DNS
Зеркала М.Двача: m2ch.hk, m2ch.lib, m2chfapiswfw2wcakptqp4o6ltgchvjuxfab7urxlduraomtlnhw5xad.onion