Менеджер экранов в XNA

06.08.2012 at 19:14

Начав писать свою игру, я столкнулся с тем, что XNA не предоставляет каркаса игры. Так называемого менеджера игровых экранов. В сети есть множество примеров, но многие из них мне не подошли своей сложностью. Именно с этих слов чаще всего начинается создание очередного велосипеда :-)

Перейдем непосредственно к коду.

// Список экранов.
private List<Screen> screens;
// Индекс активного экрана.
private int activeScreenIndex = -1;
// Признак того, что игра началась.
private bool started = false;

public ScreenManager()
{
    screens = new List<Screen>();
}

Пока ничего сложного — поля и конструктор. Дальше начинается логика менеджера:

// Добавить экран в менеджер экранов.
public void AddScreen(Screen screen)
{
    if (started)
        throw new Exception("Game is already started");
    if (screens.IndexOf(screen) == -1)
        screens.Add(screen);        
}

Этот метод будет использоваться при инициализации программы.

// Начать игру с определенного экрана.
public void StartFromScreen(int screenIndex)
{
    if (started)
        throw new Exception("Game is already started");
    started = true;
    activeScreenIndex = screenIndex;
    screens[activeScreenIndex].Activate();        
}

Этот метод используется 1 раз за время жизни программы — вызывать его нужно уже после того, как были добавлены все экраны.

// Активировать экран.
public void ActivateScreen(int screenIndex)
{
    if (!started)
        throw new Exception("Game is not started yet.");
    if ((screenIndex < 0) || (screenIndex > screens.Count - 1))
        throw new Exception("Invalid screen index.");

    if (screenIndex != activeScreenIndex)
    {
        if (activeScreenIndex > -1)                
            screens[activeScreenIndex].Deactivate();                                
        activeScreenIndex = screenIndex;
        screens[activeScreenIndex].Activate();            
    }        
}

А вот этот метод уже будет использоваться постоянно — он переключает экраны.
В пару к классу менеджера экранов нужен класс экрана, но про него я напишу в следующий раз.
Я не стал делать менеджер одиночкой для того, чтобы не усложнять код. Про одиночку я напишу в одной из следующих заметок.

Tags: