LOL Engine
Прошу прощения, что постов давно нет.
У меня дедлайн. На неделе постараюсь выложить что-то по движку.
Прошу прощения, что постов давно нет.
У меня дедлайн. На неделе постараюсь выложить что-то по движку.
Всем привет.
Из комментов в прошлых постах я кое что изменил. Огромное спасибо всем, кто помогает мне учиться:
Переделал структуру на гите и вынес include по совету из коммента
Взял spdlog для логов. Пока не оборачивал - сделаю позже.
Убрал Timer и this_thread::sleep
Как советовали, вместо того, чтобы заниматься фигней и получать состояние выполнения bool, сделал возврат состояния EXIT_SUCCESS/EXIT_FAILURE прямо из Application, ну и убрал все инициализации в конструктор
Структура проекта больше похожа на другие проекты на гите:
src / include / thirdparty / example (куда убрал базовый проект. Он пока пустоват. Займусь)
Инициализация запускаемого проекта проходит теперь через два extern.
Один прокидывает настройки приложения (разрешение, название, лимит кадров, название стартовой сцены)
Второй регистрирует сцены в SceneManager
Ну и удалил бгмерзский ServiceProvider. Это была ну ооочень плохая идея. Возможно, не буду изобретать велосипед, а просто возьму потом какую-нибудь DI библиотеку типа Boost.DI
Основной работы прибавилось, так что занимаюсь пет-проектом пореже. Спасибо всем кто участвует и помогает!
(пожалуй, буду нумеровать посты по дням)
Итак, сегодня после работы поработал немного больше.
Синглтоны в проекте будут, куда без них, но складывать их в глобальном пространстве я не люблю, так как такое трудно отлаживать. Поэтому, в Application появился ServiceProvider, в который я начал складывать все синглтоны для последующего прокидывания вглубь приложения. Вместо Logger::getInstance() будет _serviceProvider->GetService<Logger>()
Таким образом доступ к сервисам не будет у тех, у кого его быть не должно, а тех, у кого доступ есть - будет легче отлаживать.
Победить сборку под веб сегодня не получилось, пошел сидеть над этим дальше.
Основная работа не позволяет заниматься движком много времени в день, но постараюсь что-то полезное делать ежедневно.
Принял решение не тратить много времени на расписывание каждой строчки кода, лучше этот часик потратить на сам код.
Из личного заметил, что два дня уже не думскролю пикабу, а пишу код. Очень этому рад, так что даже если эти посты будут набирать больше минусов, чем плюсов, все равно продолжу.
Как всегда - жду ваши плюсы/минус/комменты. Пошел кодить дальше
Денёк выдался тяжелый и кодить получилось мало, но, учитывая успешный успех предыдущего поста, пора браться за работу.
На сегодня успелось только собрать базу на гит и вызывать окошко. Обо всем по порядку:
Код движка расположился в папке LOLEngine, и собираться он будет в виде статической библиотеки. Точка входа int main() тоже будет расположена здесь.
Код проекта будет в папке Game, сборка - в исполняемый файл.
Ну и все сторонние библиотеки будут складываться в папку ThirdParty.
Начну с подключения сабмодулей к своему репозиторию. Мне понадобятся: сейчас - glfw, потом - glm (сильно потом сюда будут спиханы все json, imgui и прочее)
Сабмодули подключил, обновил, проверил наличие в папке ThirdParty. Далее - прежде чем открывать папку репозитория в VS Code, следует сразу создать файл .gitignore (чтобы в комит не шло то, что не должно туда идти) и файл CMakeLists.txt в корне репозитория, и по одному CMakeLists.txt в папках LOLEngine и Game
Открываю папку в VS Code и создаю файл main.cpp в LOLEngine/Internal и пустой GameSettings.cpp в Game/Sources (в каждый проект надо добавить как минимум один файл исходного кода, чтобы CMake не ругался)
CMAKE_SUPPRESS_REGENERATION добавил, чтобы при сборке в IDE не создавался таргет для теста сборки
Движок и исполняемый проект подключаю через add_subdirectory. CMake найдет файлы CMakeLists в соответствующих папках.
В туториалах часто видел, как все добавляемые файлы прописывают вручную в add_executable или add_library.
Здесь я использую file(GLOB_RECURSE) чтобы рекурсивно пройти по папкам и найти все файлы, сохранить их в переменную GAME_SOURCES и GAME_HEADERS и дальше добавить в проект. Для сборки достаточно добавить только cpp и c файлы, но чтобы hpp, h были видны в IDE если кто-то соберет под Visual Studio или XCode, добавляю и их.
source_group(TREE) сохранит структуру каталогов при сборке под IDE
Нахожу OpenGL, аналогично Game, прохожусь рекурсивно по папкам в поисках исходников, подключаю в статическую библиотеку.
Далее папку с внутренними заголовками подключаю как PRIVATE, а папку Include и загаловки glm, glfw - как PUBLIC, чтобы они были видны в Game
Ну и заканчиваю подключением библиотек. Если в папке сабмодуля есть CMakeLists.txt высокая вероятность, что ее можно подключить через add_subdirectory и не париться вообще (Imgui потом придется собирать самим)
С этим закончили. Теперь если в main.cpp написать простой int main(), то все запустится.
Теперь проекту нужно передать размер и название окна в движок (позднее и некоторые другие данные). Для этого в LOLEngine/Include/Engine/Core создаю файл AppSettings.hpp и объявляю простую структурку.
Все внешние функции и методы я сложу в файле LOLEngine/Include/Engine/ExternalSettings.hpp где пока будет объявлена одна extern функция GetApplicationSettings()
В папке Game/Sources/ создаю файл GameSettings.cpp и пишу реализацию функции GetApplicationSettings();
Возвращаюсь в движок - в main.cpp и получаю первые настройки из исполняемого модуля Game.
Запускаю и радуюсь окошку.
На сегодня это все. Успел мало, но надеюсь разогнаться на днях. Спасибо тем, кто подписался и @AABVGD, за идею написать под веб-сборку. В следующем посте постараюсь подключить OpenGL, glad и emscripten для сборки цветного окошка под desktop и web. Ссылка на репо
Ставьте плюсы/минусы, пишите в комментах что я сделал так, а что не так.
PS: Если кто знает как вставлять код с форматированием на Pikabu, расскажите