Класс экрана для менеджера экранов

15.09.2012 at 16:41

Продолжение поста про менеджер экранов.

Класс экрана унаследован от 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().

Tags: