Создание класса 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