Создание класса GamePieceCollection

Класс GamePieceCollection является производным от общего класса List, и в нем появляются методы, упрощающие управление несколькими объектами GamePiece.

Создание кода

Конструктор кода GamePieceCollection инициализирует закрытый член capturedIndex. Это поле используется для слежения за тем, какой из элементов игры в настоящее время выполнил захват мыши.

#region PrivateMembersAndConstructor
private int capturedIndex;

public GamePieceCollection()
{
    // No capture yet.
    capturedIndex = -1;
}
#endregion

Методы ProcessInertia и Draw упрощают код, нужный в методах игры Game.Update и Game.Draw, перечисляя все элементы игры в коллекции и вызывая соответствующий метод для каждого объекта GamePiece.

#region ProcessInertiaAndDraw
public void ProcessInertia()
{
    foreach (GamePiece piece in this)
    {
        piece.ProcessInertia();
    }
}

public void Draw()
{
    foreach (GamePiece piece in this)
    {
        piece.Draw();
    }
}
#endregion

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

Если в данный момент никакой элемент не выполнил захват, метод UpdateFromMouse выполняет перечисление всех элементов игры с последнего по первый и проверяет, сообщает ли этот элемент о захвате мыши. В подобном случае этот элемент становится текущим захваченным элементом, и никакая дальнейшая обработка не выполняется. Метод UpdateFromMouse сначала проверяет последний элемент в коллекции, поэтому, если два элемента перекрываются, захват получит элемент с более высоким значением Z-порядка. Z-порядок не выражается явно и не является изменяемым — он просто определяется порядком, в котором элементы игры добавляются в коллекцию.

#region UpdateFromMouse
public void UpdateFromMouse()
{
    MouseState mouseState = Mouse.GetState();

    // If there is a current capture and
    // that piece still reports having the capture,
    // then return. Another piece cannot have the capture now.
    if (capturedIndex >= 0 && 
        capturedIndex < Count 
        && this[capturedIndex].UpdateFromMouse(mouseState))
    {
        return;
    }

    capturedIndex = -1;
    // A higher numbered index gets first chance
    // for a capture. It is "on top" of a lower numbered index.
    for (int index = Count - 1; index >= 0; index--)
    {
        if (this[index].UpdateFromMouse(mouseState))
        {
            capturedIndex = index;
            return;
        }
    }
}
#endregion

См. также

Основные понятия

Использование манипуляций и инерции в приложении XNA

Создание класса GamePiece

Создание класса Game1

Полные листинги кода

Другие ресурсы

Манипуляции и инерция