Структурирование игрового движка на основе состояний и помощь по структуре Makefile?

Я работаю над движком игры на основе состояний, и для начала у меня есть кое-что, что меня устраивает.

Есть абстрактный класс GameState.hpp с виртуальными методами, которые я использую (инициализация, запуск, пауза и т. Д.).

Там GameEngine.cpp / hpp, который представляет собой класс, содержащий стек объектов GameState и наборов запустить игровой цикл, запустив соответствующие методы текущего состояния.

Моя тестовая игра TestGame.cpp создает объект GameEngine и отправляет экземпляр TestState, запускает и т. д. Все работает так, как я ожидал.

Я хочу структурировать мое исходное дерево вместо того, чтобы компилировать все из одного каталога, и думал о следующем, поскольку в каждой игре будет несколько состояний:

src/
  +Engine/
    +GameEngine.cpp
    +GameEngine.hpp
    +GameState.hpp
  +TestGame/
    +States/
      +TestState.cpp
      +TestState.hpp
    +TestGame.cpp

При сборке я не уверен, понимаю ли я, что нужно компилировать, с чем, и куда должны идти скомпилированные объекты.

Итак, мои первоначальные мысли следующие:

  1. Скомпилировать GameEngine.cpp / hpp с GameState.hpp, дает GameEngine.o

  2. Скомпилировать каждое состояние игры, например. TestState.cpp / hpp с GameState.hpp, дает TestState.o

  3. Скомпилировать TestGame.cpp / hpp с GameEngine.o / hpp, GameState.hpp, TestState.o / hpp (и в любых других состояниях), дает TestGame.bin

На правильном ли я пути? Следует ли GameEngine создавать библиотеку или обычный .o нормально? Я все еще не уверен, нужно ли мне включать заголовки в каждую компиляцию. Кроме того, должны ли файлы вывода для каждой компиляции находиться в том же каталоге, что и исходный код, или они должны находиться в структурированном каталоге bin /?

Я поиграю и опубликую несколько попыток и вывода Makefile. Дайте мне знать, если я должен опубликовать код, всего около 200 строк. Никакой реальной реализации графики и т.д ... На данный момент только фреймворк.

Спасибо, ребята, любая помощь очень ценится!

РЕДАКТИРОВАТЬ: Спасибо за быстрые ответы, люди. Я прочитал комментарии ниже и хотел дать обновленную информацию и кое-что прояснить.

Во-первых, я изучаю autotools, но это в основном обучающий проект, и частью этого является создание make-файлов. Кроме того, у меня есть опыт работы с Java, поэтому я действительно хочу понять, что именно я создаю и как мой проект сочетается друг с другом. Как и выше, я даже не знаю, должно ли что-то быть библиотекой или просто указываться во время компиляции.

Обзор моей цели : Я рассматриваю движок почти как подпроект. Несмотря на свою простоту (<10 файлов), он загрузит то, что я считаю «состояниями», и зациклит методы [ обработки событий, обновления, отображения ], которые определяет состояние. У меня есть алгоритм, который стремится к постоянному количеству обновлений в секунду, изменяя при этом частоту кадров по мере необходимости.

Метод состояния display , например, будет использовать функции отображения движка, поддерживаемые SDL (может быть, тайловый движок, состояние может сказать «загрузить эти ресурсы, отобразить эти тайлы» или библиотеку виджетов, что угодно…) для рендеринга представления модели игрового мира. Метод обработки событий может использовать абстрактный интерфейс клавиатуры. Я хочу иметь возможность добавлять такие функции в движок. Обновление будет управлять моделью, представляющей игровой мир. Он будет отслеживать объекты в мире (сцена, игрок и np), применять движение на основе физики и обнаружение столкновений и т. Д.

Я думаю, что хочу иметь возможность построить это и просто включить объект ( и заголовки?) в игре, над которой я работаю. Будь то вопрос 'скопируйте исходный каталог движка в корень игрового проекта и добавьте его в основной Makefile, соберите все вместе' или 'запускать make на движке всякий раз, когда он изменяется, строить игровой проект с копией последнего объекта движка (общего объекта, чего-то еще?) и заголовков', что мне будет проще всего работать с несколькими небольшими игровыми проектами на одном движке? Я как бы хочу настроить себя так, чтобы я мог приступить к работе со случайными игровыми идеями, как у меня они есть, например, двухнедельные компиляции кодирования и т. Д.

Состояния представляют собой любое другое представление и набор взаимодействий. Движок имеет стек состояний LIFO, поэтому простая игра может иметь в стеке следующие состояния: DrivingMode - PauseMenu - Настройки В реальной игре есть экземпляр GameEngine, и для запуска игры должен быть добавлен режим DrivingMode. Пользователь делает паузу, которая приостанавливает состояние DrivingMode и нажимает состояние PauseMenu (запускает его init, run и т. Д. При нажатии). Здесь пользователь выбирает настройки, которые приостанавливают состояние PauseMenu и загружают настройки ... Когда они выходят обратно, состояния всплывают (очистка и т. Д. ... сначала запускается), и восстанавливается верхнее состояние. сейчас же. Я буду добавлять больше или задавать новые вопросы по мере продвижения. Еще раз огромное спасибо за вашу помощь.

6
задан StillLearningCPP 24 June 2011 в 08:47
поделиться