1

要件の一部として、元のコードと同じように動作するようにコードを変更しようとしていますが、理解できないようです。

私はすでにいくつかの変更を行っており、正常にコンパイルされていますが、スタッククラスをリストのように機能させることはできません:

リスト (オリジナル):

private List<Gem> gems = new List<Gem>();
private List<Enemy> enemies = new List<Enemy>();

private void UpdateGems(GameTime gameTime)
{
    for (int i = 0; i < gems.Count; ++i)
    {
        Gem gem = gems[i];
        gem.Update(gameTime);

        if (gem.BoundingCircle.Intersects(Player.BoundingRectangle))
        {
            gems.RemoveAt(i--);
            OnGemCollected(gem, Player);
        }
    }
}

スタック(私の修正版):

private Stack<Gem> gems = new Stack<Gem>();
private Stack<Enemy> enemies = new Stack<Enemy>();

/// <summary>
/// Animates each gem and checks to allows the player to collect them.
/// </summary>
private void UpdateGems(GameTime gameTime)
{
    Gem[] array = gems.ToArray();

    for (int i = 0; i < gems.Count; ++i)
    {
        Gem gem = array[i];
        gem.Update(gameTime);
        if (gem.BoundingCircle.Intersects(Player.BoundingRectangle))
        {
            gems.Pop();
            OnGemCollected(gem, Player);
        }
    }
}
4

1 に答える 1

1

私が考えることができる最高:

private Stack<Gem> gems = new Stack<Gem>();
private Stack<Enemy> enemies = new Stack<Enemy>();

/// <summary>
/// Animates each gem and checks to allows the player to collect them.
/// </summary>
private void UpdateGems(GameTime gameTime)
{
    var newGems = new Stack<Gem>(this.gems.Count);

    while (this.gems.Count > 0)    
    {
        var gem = this.gems.Pop();
        gem.Update(gameTime);

        if (gem.BoundingCircle.Intersects(Player.BoundingRectangle))
        {
            OnGemCollected(gem, Player);
        }
        else
        {
            newGems.Push(gem);
        }
    }

    this.gems = newGems;
}

あまり意味がありません。

于 2013-05-18T17:34:09.877 に答える