Менеджер экранов в XNA
Начав писать свою игру, я столкнулся с тем, что 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(); } }
А вот этот метод уже будет использоваться постоянно — он переключает экраны.
В пару к классу менеджера экранов нужен класс экрана, но про него я напишу в следующий раз.
Я не стал делать менеджер одиночкой для того, чтобы не усложнять код. Про одиночку я напишу в одной из следующих заметок.