Управление игровым экраном - PullRequest
3 голосов
/ 19 мая 2011

Я работаю над менеджером экрана для миниатюрного игрового движка, и до сих пор не могу найти правильного решения для управления объектами на экране, не используя «blob» для каждого из экранов.Является ли blob допустимым в таких случаях, когда мне нужен список объектов для визуализации в одном контроллере?

Ответы [ 2 ]

1 голос
/ 20 мая 2011

Я недавно написал что-то, что вы могли бы назвать «диспетчером экрана».

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

Так что в основном «игровое состояние» отвечает за знание того, как визуализировать себя, и должно делать это, когда ему предоставляется поверхность визуализации из диспетчера экрана или графической системы (оно также должно отвечать за другие вещи, такие как знание ввода, физика и т.д. действуют на себя).

Я реализовал его с помощью синглтона для объекта 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 экран или графическая подсистема для рендеринга. Я не уверен, используете ли вы несколько экранов, или мобильный телефон, или консоль. Другой способ, которым я хотел бы это сделать, - это иметь графическую систему в качестве статических глобальных переменных в отдельном файле, предоставляя им только область видимости файла и имея в этом файле функции доступа (мой старый способ работы с Си).

Ключом является инкапсуляция. Пусть ваш менеджер экрана управляет оборудованием. Пусть ваше игровое состояние диктует, как себя выразить.

Если это не так, пожалуйста, уточните свой вопрос, и я могу отредактировать ответ.

1 голос
/ 20 мая 2011

Я бы рассмотрел использование шаблона MVC в этой ситуации. В противном случае, если вы не будете осторожны, очень легко получить кучу спагетти-кода, где экранный код проникает в код игры, и наоборот.

...