GamePieceCollection クラスの作成
GamePieceCollection クラスはジェネリックな List クラスから派生し、複数の GamePiece オブジェクトの管理を簡単にするためのメソッドを組み込みます。
コードの作成
GamePieceCollection クラスのコンストラクターは、プライベート メンバーである capturedIndex を初期化します。 このフィールドは、現在マウス キャプチャを持つゲーム ピースを追跡するために使用されます。
#region PrivateMembersAndConstructor
private int capturedIndex;
public GamePieceCollection()
{
// No capture yet.
capturedIndex = -1;
}
#endregion
ProcessInertia メソッドと Draw メソッドは、コレクション内のすべてのゲーム ピースをエミュレートし、GamePiece オブジェクトごとにそれぞれのメソッドを呼び出すことで、ゲームの Game.Update メソッドおよび Game.Draw メソッドで必要とされるコードを簡素化します。
#region ProcessInertiaAndDraw
public void ProcessInertia()
{
foreach (GamePiece piece in this)
{
piece.ProcessInertia();
}
}
public void Draw()
{
foreach (GamePiece piece in this)
{
piece.Draw();
}
}
#endregion
UpdateFromMouse メソッドは、ゲームの更新でも呼び出されます。 これにより、マウス キャプチャを持つゲーム ピースが常に 1 つだけになるようにします。これは、現在のキャプチャが存在する場合に、それが有効であるかどうかを最初に確認することによって行われます。 マウス キャプチャが有効である場合は、他のピースがキャプチャの確認を行うことは許可されません。
現在キャプチャを持っているピースがない場合は、UpdateFromMouse メソッドが最後のゲーム ピースから最初のゲーム ピースに向かって各ピースを列挙し、マウス キャプチャを求めるピースがないかどうかを確認します。 該当するピースがあると、それが現在キャプチャを持つピースとなり、処理はそれ以上行われません。 UpdateFromMouse メソッドは、最初にコレクション内の最後のアイテムを確認します。これは、2 つのピースが重複した場合に、上位の 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