[ b / news / + ]
Главная Юзердоски Каталог Трекер NSFW Настройки

Gamedev

Ответить в тред Ответить в тред
Check this out!
<<
Назад | Вниз | Каталог | Обновить | Автообновление | 15 2 6
Нормальная реализация системы энтити Hotchkiss # OP 17/09/24 Втр 10:40:25 974679 1
image.png 1710Кб, 1080x951
1080x951
Пишу свой движок на крестах, дошла очередь до реализации системы создания сущностей. Что я хочу получить по итогу:

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

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

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

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

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

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

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