?

Log in

No account? Create an account

Программирование на "С/C++" и не только

Entries by category: игры

Модульная архитектура игрового движка
topright
При работе над архитектурой игрового движка (на C++) появилось следующее соображение. Если игра состоит из нескольких глав или режимов, каждый из которых загружает свои ресурсы и отличается своей игровой логикой, то каждый режим или главу удобно оформить в виде отдельного класса со своими Init/Release Resources, Process и Draw. Ниже описана архитектура такого приложения, и я буду благодарен за любые конструктивные замечания и советы. Возможно, есть более простые и идиоматические подходы, которые вам известны.

В класс-Game я вынес 1. ссылки на синглтоны Майерса draw, input, audio 2. методы инициализации игры и освобождения памяти из-под неё. Game сам является синглтоном. Обратите внимание на идиому, которую я при этом использую: Game - абстрактный класс, все его члены статические. Невозможно создать экземпляр этого класса, но его статические методы можно использовать. В отличие от традиционной идиомы определения синглтона (Банда Четырех, Александреску, Майерс), здесь нет нужды 1. определять метод Instance() 2. описывать конструкторы, оператор присваивания и деструктор как приватные. При этом мы выделяем синглтон на синтаксическом уровне: все обращения к его членам из функции main() осуществляются через "Game :: method()".

Каждый класс-GameMode должен иметь прямой доступ к draw, input, audio, и запись Game::draw нас не устраивает. По этой причине я решил сделать классы-GameMode наследниками класса-Game.

Game::Register() позволяет зарегистрировать новый режим игры. При запуске Game::Start() указывается стартовый режим и включается главный цикл приложения (обработка сообщений Windows). Игра крутится до тех пор, пока не произойдет выход из какого-нибудь режима и метод GameMode::Process() не вернет id несуществующего режима. Это значит, что игра завершается, а не переходит в новый режим.

Каркас приложенияCollapse )

Результат работы приложенияCollapse )