RelictEngine: анриляшная наркомания и основной цикл
Основной цикл движка на данный момент выглядит так:
Пользователь создает класс от класса Relict::Application в котором необходимо разместить базовую (не игровую) логику работы приложения. Для этого ему доступны евенты PreInit, Init, PostInit, Tick, PreShutdown и Shutdown.
Простое приложение, которое самоуничтожается после 3х секунд после запуска (читайте как Hello World)
В main функции приложения (в последствие это все уедет в темплейт и/или макрос) необходимо создать Шаред экземпляр нашего класса Application, Вызвать функцию создания экземпляра движка (т.к. при создании объекта Application сделать это нельзя из-за того, что std::enable_shared_from_this еще не инициализирована, а она нужна для Engine) запустить его инициализацию и основной цикл. И не забыть вернуть из функции main код выхода приложения, который вернет метод Shutdown.
Пока так, потом main будет заменено на нормальный вариант в зависимости от платформы (main и WinMain), а вся вот эта писанина улетит в макрос инициализации
Как можно заметить, здесь используются SharedPtr. Пока-что это просто залипуха над shared_ptr std библиотеки (и unique_ptr соответственно). Сделано для того, чтобы не пришлось переписывать половину кода, в случае, если мне придется делать свои указатели (или использовать из какой-нибудь более другой нежели std библиотеки)
Это что касалось основного базового цикла. Теперь о том, что я имел ввиду под анриляшной наркоманией.
Во первых. Все классы движка должны быть отнаследованы от некоей базовой сущности. В случае Анрила это UBaseObject, в моем - Object. Сделано это для того, чтобы все объекты в дереве вызовов знали друг о друге (сборщика мусора не предусмотрено). И чтобы всегда можно было обратится к объекту, породившему текущий объект через метод GetOwner. Правда это накладывает дополнительные ограничения на констурктор, которые в Unreal это решается все generated заголовочниками. Ну а я пока-что пошел наркоманским путем.
Сразу попытался решить проблему, в случае, если объекту нужны дополнительные параметры в конструктор.
Пока не знаю, угадал ли я с решением, или это придется переписать на что-то более вменяемое. Как минимум точно нужно будет подумать над сценарием, когда нужен дополнительный конструктор объекта без параметров (дефолтный конструктор). Может сложится ситуация, когда такой объект будет создан не через макрос NewObject, а через обычный new или make_shared - тогда будут проблемы, ибо Owner не будет инициализирован.
Также сделал дополнительный Реликт World, в котором описывается Мир, сцены и отдельные ноды сцены. Но об этом расскажу позже, когда придумаю нормально, как с ними работать через GameFramework сущности.



Лига Разработчиков Видеоигр
8.8K поста23.1K подписчика
Правила сообщества
ОБЩИЕ ПРАВИЛА:
- Уважайте чужой труд и используйте конструктивную критику
- Не занимайтесь саморекламой, пишите качественные и интересные посты
- Никакой политики
СТОИТ ПУБЛИКОВАТЬ:
- Посты о Вашей игре с историей её разработки и описанием полученного опыта
- Обучающие материалы, туториалы
- Интервью с опытными разработчиками
- Анонсы бесплатных мероприятий для разработчиков и истории их посещения;
- Ваши работы, если Вы художник/композитор и хотите поделиться ими на безвозмездной основе
НЕ СТОИТ ПУБЛИКОВАТЬ:
- Посты, содержащие только вопрос или просьбу помочь
- Посты, содержащие только идею игры
- Посты, единственная цель которых - набор команды для разработки игры
- Посты, не относящиеся к тематике сообщества
Подобные посты по решению администрации могут быть перемещены из сообщества в общую ленту.
ЗАПРЕЩЕНО:
- Публиковать бессодержательные посты с рекламой Вашего проекта (см. следующий пункт), а также все прочие посты, содержащие рекламу/рекламные интеграции
- Выдавать чужой труд за свой
Подобные посты будут перемещены из сообщества в общую ленту, а их авторы по решению администрации могут быть внесены в игнор-лист сообщества.
О РАЗМЕЩЕНИИ ССЫЛОК:
Ссылка на сторонний ресурс, связанный с игрой, допускается только при следующих условиях:
- Пост должен быть содержательным и интересным для пользователей, нести пользу для сообщества
- Ссылка должна размещаться непосредственно в начале или конце поста и только один раз
- Cсылка размещается в формате: "Страница игры в Steam: URL"