Я недавно написал что-то, что вы могли бы назвать «диспетчером экрана».
Я начал с идеи, что в какой бы игре я не работал, система рендеринга будет примерно одинаковой с точки зрения рендеринга (управления аппаратным обеспечением). Изменяется только то, что отображается, и как его рисовать (хочу ли я поле, круг или растровое изображение ... представляющее что ... и т. Д.).
Так что в основном «игровое состояние» отвечает за знание того, как визуализировать себя, и должно делать это, когда ему предоставляется поверхность визуализации из диспетчера экрана или графической системы (оно также должно отвечать за другие вещи, такие как знание ввода, физика и т.д. действуют на себя).
Я реализовал его с помощью синглтона для объекта GraphicsSystem, который назывался примерно так:
GameState gs;
Graphics::System().Init(DOUBLE_BUFFER, 640, 480);
...
while(still_looping) {
...
// When it is time to render:
Graphics::System().RenderGameState(&gs);
}
А как, спросите вы, синглтон Graphics :: System () знает, как отобразить состояние игры? Он знает, потому что игровое состояние наследуется от слушателя, представленного графической системой ...
//within GraphicsSystem.h...
class BaseRenderer
{
public:
virtual void Render(BITMAP *render_surface) = 0;
};
//GameState defined with:
class GameState : public BaseRenderer
{
public:
void Render(BITMAP *render_surface);
...
Вы можете сделать это почти со всеми подсистемами ... (возможно, не синхронизированными, поскольку это необходимо в игровом цикле).
Почему синглтоны? Ну, это C ++, и я предполагаю, что есть только 1 экран или графическая подсистема для рендеринга. Я не уверен, используете ли вы несколько экранов, или мобильный телефон, или консоль. Другой способ, которым я хотел бы это сделать, - это иметь графическую систему в качестве статических глобальных переменных в отдельном файле, предоставляя им только область видимости файла и имея в этом файле функции доступа (мой старый способ работы с Си).
Ключом является инкапсуляция. Пусть ваш менеджер экрана управляет оборудованием. Пусть ваше игровое состояние диктует, как себя выразить.
Если это не так, пожалуйста, уточните свой вопрос, и я могу отредактировать ответ.