Erstellen der GamePieceCollection-Klasse
Die GamePieceCollection-Klasse leitet sich von der generischen List-Klasse ab. Sie führt Methoden zum weniger aufwändigen Verwalten mehrerer GamePiece-Objekte ein.
Erstellen des Codes
Der Konstruktor der GamePieceCollection-Klasse initialisiert den privaten capturedIndex-Member. Mithilfe dieses Felds wird nachverfolgt, welcher der Spielsteine momentan über die Mausauswahl verfügt.
#region PrivateMembersAndConstructor
private int capturedIndex;
public GamePieceCollection()
{
// No capture yet.
capturedIndex = -1;
}
#endregion
Die Methoden ProcessInertia und Draw vereinfachen den Code, der in den Methoden Game.Update und Game.Draw erforderlich ist. Dazu werden alle Spielsteine der Auflistung enumeriert, und für jedes GamePiece-Objekt wird die entsprechende Methode aufgerufen.
#region ProcessInertiaAndDraw
public void ProcessInertia()
{
foreach (GamePiece piece in this)
{
piece.ProcessInertia();
}
}
public void Draw()
{
foreach (GamePiece piece in this)
{
piece.Draw();
}
}
#endregion
Die UpdateFromMouse-Methode wird auch während der Spielaktualisierung aufgerufen. Nur ein Spielstein kann jeweils über die Mausauswahl verfügen, da zuerst immer überprüft wird, ob die momentane Auswahl (falls vorhanden) noch wirksam ist. Wenn ja, kann kein anderer Spielstein eine Überprüfung auf die Mausauswahl ausführen.
Falls kein Spielstein über die Mausauswahl verfügt, enumeriert die UpdateFromMouse-Methode jeden Spielstein (vom letzten bis zum ersten), um zu ermitteln, ob ein Spielstein eine Mausauswahl meldet. Wenn ja, wird der jeweilige Spielstein zum momentan ausgewählten Spielstein, und es findet keine weitere Verarbeitung statt. Die UpdateFromMouse-Methode überprüft zuerst das letzte Element der Auflistung, damit bei einer Überlappung zweier Spielsteine der Spielstein mit der höheren Z-Reihenfolge die Mausauswahl erhält. Die Z-Reihenfolge ist weder explizit noch änderbar. Maßgebend ist allein die Reihenfolge, in der die Spielsteine der Auflistung hinzugefügt werden.
#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
Siehe auch
Konzepte
Verwenden von Manipulationen und Trägheit in einer XNA-Anwendung
Erstellen der GamePiece-Klasse