1,7 Мб, 1080x951
Пишу свой движок на крестах, дошла очередь до реализации системы создания сущностей. Что я хочу получить по итогу:
1) регистрируем сущность где-нибудь при начальной загрузке
2) Вв момент истины пишем auto EntPtr* = CreateEntityByName("classname");
3)profit, в auto получаем сразу указатель на класс-энтити нужного типа
То, до чего я додумался сам - работает без нареканий, но возвращает только указатели базового типа сущностей, от которого все наследуются. Получается, что для адекватной работы с этим указателем в дальнейшем приходится вручную приводить его под нужный тип данных, а это исключает возможность создавать энтити автоматически, зная только их класс-нейм. Очень надеюсь, что тут есть разумисты, которые уже сталкивались с такой проблемой.
1) регистрируем сущность где-нибудь при начальной загрузке
2) Вв момент истины пишем auto EntPtr* = CreateEntityByName("classname");
3)profit, в auto получаем сразу указатель на класс-энтити нужного типа
То, до чего я додумался сам - работает без нареканий, но возвращает только указатели базового типа сущностей, от которого все наследуются. Получается, что для адекватной работы с этим указателем в дальнейшем приходится вручную приводить его под нужный тип данных, а это исключает возможность создавать энтити автоматически, зная только их класс-нейм. Очень надеюсь, что тут есть разумисты, которые уже сталкивались с такой проблемой.
>>4679 (OP)
Зачем тебе это нужно, лол?
https://ru.wikipedia.org/wiki/Проблема_XY
Опиши, зачем тебе нужна эта фича.
Как она будет тобой использоваться?
Как можно было бы обойтись без неё?
Почему именно эта фича, а не другая?
Алсо, в этом разделе мало движкопись.
>CreateEntityByName("classname");
>указатель на класс-энтити нужного типа
Зачем тебе это нужно, лол?
https://ru.wikipedia.org/wiki/Проблема_XY
Опиши, зачем тебе нужна эта фича.
Как она будет тобой использоваться?
Как можно было бы обойтись без неё?
Почему именно эта фича, а не другая?
Алсо, в этом разделе мало движкопись.
>>4680
Я очень хочу сохранить исходный тип, чтобы не превращать всё в пайтон. Если все сущности будут иметь тип BaseEntity* вне зависимости от их наполнения, то при работе с ними надо будет каждый раз проверять, что мы получили, и можно ли с этим что-то сделать
Я очень хочу сохранить исходный тип, чтобы не превращать всё в пайтон. Если все сущности будут иметь тип BaseEntity* вне зависимости от их наполнения, то при работе с ними надо будет каждый раз проверять, что мы получили, и можно ли с этим что-то сделать
>>4680
Вопрос про другую фичу странный, потому что то, что я пишу - это буквально базовое API движка.
Каждое энтити - это класс в коде, который обязательно наследуется от базового. На этапе регистрации мы соотносим пользовательский класснейм с функцией-фабрикой, которая создаёт на куче новый объект нужного типа, переводит указатель в тип BaseEntity*, и возвращает его
Вопрос про другую фичу странный, потому что то, что я пишу - это буквально базовое API движка.
Каждое энтити - это класс в коде, который обязательно наследуется от базового. На этапе регистрации мы соотносим пользовательский класснейм с функцией-фабрикой, которая создаёт на куче новый объект нужного типа, переводит указатель в тип BaseEntity*, и возвращает его
>>4679 (OP)
А зачем тебе знать конкретный тип? Уровню где ты объекты создаёшь не должно быть до этого дела. Объекты как то дальше сами должны всё разруливать, если у тебя ООП. И имя скорее всего ссылается на какие то настраиваемые руками данные, описывающие что ты вообще создаёшь.
А зачем тебе знать конкретный тип? Уровню где ты объекты создаёшь не должно быть до этого дела. Объекты как то дальше сами должны всё разруливать, если у тебя ООП. И имя скорее всего ссылается на какие то настраиваемые руками данные, описывающие что ты вообще создаёшь.
>>4683
Для такого расклада имя прячется, делается шаблон вроде CreateObject<Type>(), в Type должно бысть статическое поле с именем/guid'ом или ещё чем. Получается что тип приводишь не ты и шансов получить жирный косяк минимальные. По другому никак не сделать.
Для такого расклада имя прячется, делается шаблон вроде CreateObject<Type>(), в Type должно бысть статическое поле с именем/guid'ом или ещё чем. Получается что тип приводишь не ты и шансов получить жирный косяк минимальные. По другому никак не сделать.
>>4686
Такое не проканает, потому что все шаблоны раскрываются на этапе компиляции, и получается, что невозможно создать сущность на лету по поступившим в рантайме данным. Например, если мы загружаем карту, в которой записаны класснеймы и атрибуты сущностей.
Такое не проканает, потому что все шаблоны раскрываются на этапе компиляции, и получается, что невозможно создать сущность на лету по поступившим в рантайме данным. Например, если мы загружаем карту, в которой записаны класснеймы и атрибуты сущностей.
>>4687
Тогда тебе и не нужен конкретный класс. У тебя условно говоря есть фабрика берущая имя плюс атрибуты и возвращающая объект. У тебя просто негде это класс использовать. Если же до него надо добираться позже из кода то придётся реализовывать свой RTTI.
Тогда тебе и не нужен конкретный класс. У тебя условно говоря есть фабрика берущая имя плюс атрибуты и возвращающая объект. У тебя просто негде это класс использовать. Если же до него надо добираться позже из кода то придётся реализовывать свой RTTI.
>>4688
То есть ты предлагаешь все атрибуты и кастомные функции дочерних классов сущностей хранить в какой-гибудь самописной смешной структуре? Тогда получится, что непосредственно в коде у нас только один класс, и проблема в принципе решится
То есть ты предлагаешь все атрибуты и кастомные функции дочерних классов сущностей хранить в какой-гибудь самописной смешной структуре? Тогда получится, что непосредственно в коде у нас только один класс, и проблема в принципе решится
>>4689
Абсолютно не так. Ты просто можешь сделать примерно так baseObject->Cast<Foo>(), вернёт указатель если это реально Foo и nullptr если нет. В любом движке так и делается.
Абсолютно не так. Ты просто можешь сделать примерно так baseObject->Cast<Foo>(), вернёт указатель если это реально Foo и nullptr если нет. В любом движке так и делается.
>>4690
Спасибо, пойду пробовать
Спасибо, пойду пробовать
125 Кб, 820x551
Эм... можно для тупых пояснить зачем может понадобиться в движке "система реализации создания сущностей по класснейму который передается строчкой с именем класса"?
>>4682
Ты как вообще это представляешь? У тебя допустим есть движок, который обрабатывает какую-то игру. Игра задана как последовательность комманд - "сначала двигаем игрока, потом проходим по массиву с пулями, потом двигаем НПЦ и т.п. и т.д."
В каком месте там может получиться "а ну там объект другого типа в списке, поэтому сегфолт так как я не знаю что такое интерфейс (и про ексепшоны тоже не слышал)"?
Я просто маленько динозавр в этом деле и не врубаюсь где там в логике работы вообще может возникнуть самодеятельность уровня "нам надо канпилятр песать" не говоря уже про то что есть луа как минимум
>>4682
>то при работе с ними надо будет каждый раз проверять, что мы получили, и можно ли с этим что-то сделать
Ты как вообще это представляешь? У тебя допустим есть движок, который обрабатывает какую-то игру. Игра задана как последовательность комманд - "сначала двигаем игрока, потом проходим по массиву с пулями, потом двигаем НПЦ и т.п. и т.д."
В каком месте там может получиться "а ну там объект другого типа в списке, поэтому сегфолт так как я не знаю что такое интерфейс (и про ексепшоны тоже не слышал)"?
Я просто маленько динозавр в этом деле и не врубаюсь где там в логике работы вообще может возникнуть самодеятельность уровня "нам надо канпилятр песать" не говоря уже про то что есть луа как минимум
>>4679 (OP)
Взять юнити или анрил
Поч?
И ваще через темплейт можешь фабрику сделать
= CreateEntity<MyType>();
Взять юнити или анрил
> а это исключает возможность создавать энтити автоматически, зная только их класс-нейм
Поч?
И ваще через темплейт можешь фабрику сделать
= CreateEntity<MyType>();
>>4679 (OP)
Взять юнити или анрил
Поч?
И ваще через темплейт можешь фабрику сделать
= CreateEntity<MyType>();
Взять юнити или анрил
> а это исключает возможность создавать энтити автоматически, зная только их класс-нейм
Поч?
И ваще через темплейт можешь фабрику сделать
= CreateEntity<MyType>();
>>4679 (OP)
а зачем создавать движок с нуля? что ты хочешь достичь, чего уже нет в U/UE?
а зачем создавать движок с нуля? что ты хочешь достичь, чего уже нет в U/UE?