Класс экрана для менеджера экранов
Продолжение поста про менеджер экранов.
Класс экрана унаследован от DrawableGameComponent. Благодаря этому, после добавления экрана в коллекцию компонент игры, методы Update() и Draw() будут вызываться автоматически.
Экран имеет коллекцию компонент.
public Collection<GameComponent> Components; public Screen(Game game) : base(game) { Components = new Collection<GameComponent>(); }
Метод для добавления компонент экрана в коллекцию компонент игры.
protected void AddComponentsToGame() { foreach (GameComponent component in Components) { if (this.Game.Components.IndexOf(component) < 0) this.Game.Components.Add(component); } }
Метод Update() добавляет в списокк компонент игры те компоненты, которых там нет. Это сделано для добавления тех игровых объектов, которые были созданы в процессе работы экрана. Таким образом, нет необходимости добавлять объекты в список компонент игры, достаточно добавить их в экран.
public override void Update(GameTime gameTime) { AddComponentsToGame(); base.Update(gameTime); }
Методы активации и деактивации. Именно их вызывает менеджер экранов.
public void Activate() { OnActivate(); this.Game.Components.Clear(); this.Game.Components.Add(this); foreach (GameComponent component in Components) this.Game.Components.Add(component); } public void Deactivate() { foreach (GameComponent component in Components) if (this.Game.Components.IndexOf(component) >= 0) this.Game.Components.Remove(component); if (this.Game.Components.IndexOf(this) >= 0) this.Game.Components.Remove(this); OnDeactivate(); } protected abstract void CreateComponents(); public virtual void OnActivate() { CreateComponents(); } public virtual void OnDeactivate() { this.Components.Clear(); }
Для создания класса конкретного экрана нужно унаследовать от базового класса и переопределить метод CreateComponents().