Серия «LOL Engine»

LOL Engine

Прошу прощения, что постов давно нет.
У меня дедлайн. На неделе постараюсь выложить что-то по движку.

9

LOL Engine день 3

Всем привет.

Из комментов в прошлых постах я кое что изменил. Огромное спасибо всем, кто помогает мне учиться:

Переделал структуру на гите и вынес include по совету из коммента

LOL Engine день 3 Программирование, Разработка, Gamedev, Инди, C++, Длиннопост

Include статической библиотеки

Взял spdlog для логов. Пока не оборачивал - сделаю позже.

Убрал Timer и this_thread::sleep

LOL Engine день 3 Программирование, Разработка, Gamedev, Инди, C++, Длиннопост

переделанный основной цикл

Как советовали, вместо того, чтобы заниматься фигней и получать состояние выполнения bool, сделал возврат состояния EXIT_SUCCESS/EXIT_FAILURE прямо из Application, ну и убрал все инициализации в конструктор

LOL Engine день 3 Программирование, Разработка, Gamedev, Инди, C++, Длиннопост

int main стал аккуратнее

Структура проекта больше похожа на другие проекты на гите:

src / include / thirdparty / example (куда убрал базовый проект. Он пока пустоват. Займусь)

LOL Engine день 3 Программирование, Разработка, Gamedev, Инди, C++, Длиннопост

Более аккуратная структура

Инициализация запускаемого проекта проходит теперь через два extern.

Один прокидывает настройки приложения (разрешение, название, лимит кадров, название стартовой сцены)

Второй регистрирует сцены в SceneManager

LOL Engine день 3 Программирование, Разработка, Gamedev, Инди, C++, Длиннопост

Ну и удалил бгмерзский ServiceProvider. Это была ну ооочень плохая идея. Возможно, не буду изобретать велосипед, а просто возьму потом какую-нибудь DI библиотеку типа Boost.DI

Основной работы прибавилось, так что занимаюсь пет-проектом пореже. Спасибо всем кто участвует и помогает!

Ссылка на пустоватый репозиторий

Показать полностью 4
7

LOL Engine день 2

(пожалуй, буду нумеровать посты по дням)

Итак, сегодня после работы поработал немного больше.

Из полезностей - абстрагировал мусор в int main() в класс Application, добавил Logger и Timer (на очереди WindowManager и Renderer)

LOL Engine день 2 Программирование, Gamedev, Инди, Игровой движок, C++, Длиннопост

LOLEngine/Internal/main.cpp

Из важного - сделал ServiceProvider.

LOL Engine день 2 Программирование, Gamedev, Инди, Игровой движок, C++, Длиннопост

LOLEngine/Include/Engine/Core/ServiceProvider.hpp

Синглтоны в проекте будут, куда без них, но складывать их в глобальном пространстве я не люблю, так как такое трудно отлаживать. Поэтому, в Application появился ServiceProvider, в который я начал складывать все синглтоны для последующего прокидывания вглубь приложения. Вместо Logger::getInstance() будет _serviceProvider->GetService<Logger>()

LOL Engine день 2 Программирование, Gamedev, Инди, Игровой движок, C++, Длиннопост

LOLEngine/Internal/Engine/Core/Application.cpp

Таким образом доступ к сервисам не будет у тех, у кого его быть не должно, а тех, у кого доступ есть - будет легче отлаживать.

Репозиторий все там-же

Победить сборку под веб сегодня не получилось, пошел сидеть над этим дальше.

Основная работа не позволяет заниматься движком много времени в день, но постараюсь что-то полезное делать ежедневно.

Принял решение не тратить много времени на расписывание каждой строчки кода, лучше этот часик потратить на сам код.

Огромное спасибо всем, кто задает вопросы в комментах и тычет носом в ошибки - постараюсь учесть и исправить. Вырасти, так сказать, над собой.

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

Как всегда - жду ваши плюсы/минус/комменты. Пошел кодить дальше

Показать полностью 2
7

Девлог LOLEngine 0

Привет, игроделы!

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

Девлог LOLEngine 0 Разработка, Программирование, Gamedev, Инди, Длиннопост

На сегодня успелось только собрать базу на гит и вызывать окошко. Обо всем по порядку:

Завел проект на гите и стянул его на машину. Далее создал вот такую структуру папок:

Девлог LOLEngine 0 Разработка, Программирование, Gamedev, Инди, Длиннопост

Код движка расположился в папке LOLEngine, и собираться он будет в виде статической библиотеки. Точка входа int main() тоже будет расположена здесь.

Код проекта будет в папке Game, сборка - в исполняемый файл.

Ну и все сторонние библиотеки будут складываться в папку ThirdParty.

Начну с подключения сабмодулей к своему репозиторию. Мне понадобятся: сейчас - glfw, потом - glm (сильно потом сюда будут спиханы все json, imgui и прочее)

Девлог LOLEngine 0 Разработка, Программирование, Gamedev, Инди, Длиннопост

Сабмодули подключил, обновил, проверил наличие в папке ThirdParty. Далее - прежде чем открывать папку репозитория в VS Code, следует сразу создать файл .gitignore (чтобы в комит не шло то, что не должно туда идти) и файл CMakeLists.txt в корне репозитория, и по одному CMakeLists.txt в папках LOLEngine и Game

Девлог LOLEngine 0 Разработка, Программирование, Gamedev, Инди, Длиннопост

Открываю папку в VS Code и создаю файл main.cpp в LOLEngine/Internal и пустой GameSettings.cpp в Game/Sources (в каждый проект надо добавить как минимум один файл исходного кода, чтобы CMake не ругался)

Далее перехожу в корневой CMakeLists и пишу следующее:

Девлог LOLEngine 0 Разработка, Программирование, Gamedev, Инди, Длиннопост

CMAKE_SUPPRESS_REGENERATION добавил, чтобы при сборке в IDE не создавался таргет для теста сборки

Движок и исполняемый проект подключаю через add_subdirectory. CMake найдет файлы CMakeLists в соответствующих папках.

CMakeLists.txt проекта Game выглядит так:

Девлог LOLEngine 0 Разработка, Программирование, Gamedev, Инди, Длиннопост

В туториалах часто видел, как все добавляемые файлы прописывают вручную в add_executable или add_library.

Здесь я использую file(GLOB_RECURSE) чтобы рекурсивно пройти по папкам и найти все файлы, сохранить их в переменную GAME_SOURCES и GAME_HEADERS и дальше добавить в проект. Для сборки достаточно добавить только cpp и c файлы, но чтобы hpp, h были видны в IDE если кто-то соберет под Visual Studio или XCode, добавляю и их.

source_group(TREE) сохранит структуру каталогов при сборке под IDE

Далее на очереди CMakeLists движка:

Нахожу OpenGL, аналогично Game, прохожусь рекурсивно по папкам в поисках исходников, подключаю в статическую библиотеку.

Девлог LOLEngine 0 Разработка, Программирование, Gamedev, Инди, Длиннопост

Далее папку с внутренними заголовками подключаю как PRIVATE, а папку Include и загаловки glm, glfw - как PUBLIC, чтобы они были видны в Game

Девлог LOLEngine 0 Разработка, Программирование, Gamedev, Инди, Длиннопост

Ну и заканчиваю подключением библиотек. Если в папке сабмодуля есть CMakeLists.txt высокая вероятность, что ее можно подключить через add_subdirectory и не париться вообще (Imgui потом придется собирать самим)

Девлог LOLEngine 0 Разработка, Программирование, Gamedev, Инди, Длиннопост

С этим закончили. Теперь если в main.cpp написать простой int main(), то все запустится.

Девлог LOLEngine 0 Разработка, Программирование, Gamedev, Инди, Длиннопост
Девлог LOLEngine 0 Разработка, Программирование, Gamedev, Инди, Длиннопост

Заработало

Теперь проекту нужно передать размер и название окна в движок (позднее и некоторые другие данные). Для этого в LOLEngine/Include/Engine/Core создаю файл AppSettings.hpp и объявляю простую структурку.

Девлог LOLEngine 0 Разработка, Программирование, Gamedev, Инди, Длиннопост

Pikabu! Сделай форматирование кода в тексте! задолбался все картинками ставить!

Все внешние функции и методы я сложу в файле LOLEngine/Include/Engine/ExternalSettings.hpp где пока будет объявлена одна extern функция GetApplicationSettings()

Девлог LOLEngine 0 Разработка, Программирование, Gamedev, Инди, Длиннопост

В папке Game/Sources/ создаю файл GameSettings.cpp и пишу реализацию функции GetApplicationSettings();

Девлог LOLEngine 0 Разработка, Программирование, Gamedev, Инди, Длиннопост

Возвращаюсь в движок - в main.cpp и получаю первые настройки из исполняемого модуля Game.

Девлог LOLEngine 0 Разработка, Программирование, Gamedev, Инди, Длиннопост
Девлог LOLEngine 0 Разработка, Программирование, Gamedev, Инди, Длиннопост

Запускаю и радуюсь окошку.

Девлог LOLEngine 0 Разработка, Программирование, Gamedev, Инди, Длиннопост

На сегодня это все. Успел мало, но надеюсь разогнаться на днях. Спасибо тем, кто подписался и @AABVGD, за идею написать под веб-сборку. В следующем посте постараюсь подключить OpenGL, glad и emscripten для сборки цветного окошка под desktop и web. Ссылка на репо

Ставьте плюсы/минусы, пишите в комментах что я сделал так, а что не так.

PS: Если кто знает как вставлять код с форматированием на Pikabu, расскажите

Показать полностью 17
Отличная работа, все прочитано!