Я работаю над игровым движком, основанным на состоянии, и у меня есть для начала кое-что, чем я доволен.
Есть абстрактный класс GameState.hpp с виртуальными методами, которые я использую (init, run, pause и т.д ...).
Есть GameEngine.cpp / hpp, который является классом, который содержит стек объектов GameState и устанавливает игровой цикл, выполняя соответствующие методы текущего состояния.
Моя тестовая игра TestGame.cpp создает объект GameEngine, отправляет экземпляр TestState и запускается, и т. Д. ... Все работает, как я ожидаю.
Я хочу структурировать дерево исходных текстов, а не компилировать все из одной и той же директории, и подумывал о следующем, поскольку в каждой игре будет несколько состояний:
src/
+Engine/
+GameEngine.cpp
+GameEngine.hpp
+GameState.hpp
+TestGame/
+States/
+TestState.cpp
+TestState.hpp
+TestGame.cpp
При сборке я не уверен, понимаю ли я, что и с чем нужно компилировать и куда должны идти скомпилированные объекты.
Пока что мои первые мысли:
Компиляция GameEngine.cpp / hpp с GameState.hpp, дает GameEngine.o
Скомпилируйте каждое игровое состояние, например. TestState.cpp / hpp с GameState.hpp, выдает TestState.o
Компиляция TestGame.cpp / hpp с GameEngine.o / hpp, GameState.hpp, TestState.o / hpp (и любыми другими состояниями), дает TestGame.bin
Я на правильном пути? Должен ли GameEngine создать lib или обычный .o ок? Я все еще немного сомневаюсь, нужно ли мне включать заголовки в каждую компиляцию. Кроме того, выходные файлы для каждой компиляции находятся в том же каталоге, что и исходный код, или они должны находиться в структурированном каталоге bin /? *
Я поиграю и опубликую несколько попыток Makefile и их вывод. Дайте мне знать, если я должен опубликовать код, возможно, всего 200 строк. Реальной графической реализации и т. Д. Просто на данный момент фреймворк.
Спасибо, ребята, любая помощь очень ценится!
РЕДАКТИРОВАТЬ: Спасибо за быстрые ответы людей. Я прочитал комментарии ниже и хотел дать обновление и прояснить некоторые вещи.
Во-первых, я смотрю на автоинструменты, но это в основном учебный проект, и частью этого является создание make-файлов. Кроме того, я родом из Java, поэтому очень хочу понять, что именно я строю и как мой проект сочетается. Как и выше, я даже не знаю, должна ли что-то быть библиотекой или просто указывать во время компиляции.
Обзор моей цели : Я вижу двигатель почти как подпроект. Несмотря на то, что он простой (<10 файлов), он будет загружать то, что я считаю «состояниями», и циклически обрабатывать методы [<strong> обработки событий, обновления, отображения ], которые определяет состояние. У меня есть алгоритм, который стремится к постоянному количеству обновлений в секунду, при этом меняя частоту кадров при необходимости.
Например, метод display состояний будет использовать функции отображения, поддерживаемые модулем SDL (возможно, механизм листов, состояние может сказать «загрузить эти ресурсы, отобразить эти листы» или библиотека виджетов). , что угодно ...) для представления модели игрового мира.
Метод обработки событий может использовать интерфейс абстрактной клавиатуры. Я хочу иметь возможность добавить такую функциональность в движок.
Обновление будет управлять моделью, которая представляет игровой мир. Он будет следить за объектами в мире (сцена, игрок и NP), применять движения, основанные на физике и обнаружении столкновений, и т.д ...
Я думаю, что я хочу иметь возможность построить это и просто включить объект (и заголовки?) В игру, над которой я работаю. Является ли это вопросом
'скопируйте dir движка в корневой каталог игрового проекта и добавьте его в основной Makefile, соберите все вместе', или
'запускать make на движке всякий раз, когда он меняется, создавать игровой проект с копией самого последнего объекта движка (совместно используемого объекта, чего-то еще?) и заголовков',что мне будет легче работать с несколькими небольшими игровыми проектами, используя один движок?Я вроде хочу настроить себя так, чтобы я мог приступить к работе со случайными игровыми идеями, такими как у меня есть, такими как 2-недельное кодирование и т.д. ...
Состояния представляют любой другой взгляд и набор взаимодействий,Движок имеет стек состояний LIFO, поэтому простая игра может иметь в стеке следующие состояния: DrivingMode - PauseMenu - Настройки. В реальной игре есть экземпляр GameEngine, и для запуска игры будет добавлен DrivingMode.Пользователь делает паузу, которая приостанавливает состояние DrivingMode и толкает состояние PauseMenu (запускает init, run и т. Д. При нажатии).Здесь пользователь выбирает настройки, которые ставят паузу в состояние PauseMenu, и загружает настройки ... Когда они выходят обратно, состояния выталкиваются (очистка и т. Д. Запускаются первыми), а верхнее состояние возобновляется.
Wow,это куча сейчас.Я буду добавлять больше или задавать новые вопросы по мере продвижения.Огромное спасибо еще раз за вашу помощь.