簡體   English   中英

C#堆棧未更新

[英]C# Stack not updating

由於某種原因,我修改的代碼似乎無法正常運行。 調試時沒有異常錯誤,但是它的功能與原始代碼(列表)中的功能不同-也就是說,它似乎沒有更新。 我已將其定位到我認為導致問題的代碼區域:

我的原始代碼(使用列表)有效:

    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);
            }
        }
    }

這是我修改后的代碼,無法將List to Stack替換為無法正常工作:

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

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


            gem.Update(gameTime);


            if (gem.BoundingCircle.Equals(Player.BoundingRectangle))
            {
                gems.Pop();

                OnGemCollected(gem, Player);
            }
        }
    }

有任何想法嗎?

我不確切知道您需要什么,但是循環看起來有些奇怪 :如果您在第一輪中沒有從堆棧中pop()任何東西, peek()將始終返回相同的元素。 堆棧數據結構未建立索引 ,只允許彈出/查看最后推送的元素 帶有列表的代碼的行為當然會有所不同,因為您實際上正在檢查列表中的所有元素。

根據定義,當您從堆棧中彈出某些內容時,將刪除最后添加的項目。 因此,您已經顛倒了從集合中檢查和刪除Gem對象的順序-當您在Stack<Gem>版本中執行Peek and PopBoundingCircle.Equals()檢查時,您不會檢查其中的第一項像您在List<Gem>版本中的集合。

列表可以在任一方向上進行迭代,只需以適當的方式調整索引器即可。 堆棧是LIFO(后進先出),因此您只能訪問添加的最后一項。

我認為當調用peak方法時,它可能會將對該項的引用保留在堆棧集合的頂部。 因此,當您調用pop方法時。 它會無法正常工作。

我已經復制了您的示例,並將其放入控制台應用程序,如下所示

class Program
    {
        private static Stack<Gem> gems = new Stack<Gem>();
        private Stack<Enemy> enemies = new Stack<Enemy>();
        static void Main(string[] args)
        {
            gems.Push(new Gem
                {
                   BoundingCircle = new BoundingCircle
                       {
                           Name = "abc"
                       }
                });

            gems.Push(new Gem
            {
                BoundingCircle = new BoundingCircle
                {
                    Name = "def"
                }
            });

            UpdateGems(new GameTime());
        }

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


                gem.Update(gameTime);


                if (gem.BoundingCircle.Equals(Player.BoundingRectangle))
                {
                    gems.Pop();

                    OnGemCollected(gem, null);
                }
            }
        }

        private static void OnGemCollected(Gem gem, Player player)
        {

        }
    }

    public class Gem
    {
        public void Update(GameTime gameTime)
        {

        }

        public BoundingCircle BoundingCircle { get; set; }
    }

    public class Enemy
    {

    }

    public class GameTime
    {

    }

    public class BoundingCircle : Bounding
    {
        public override bool Equals(object obj)
        {
            var temp = (Bounding) obj;
            return Name.Equals(temp.Name, StringComparison.InvariantCulture);
        }
    }

    public class Player
    {
        static Player()
        {
            BoundingRectangle = new BoundingRectangle
                {
                    Name = "def"
                };
        }

        public static BoundingRectangle BoundingRectangle { get; set; }
    }

    public class BoundingRectangle : Bounding
    {

    }

    public abstract class Bounding
    {
        public string Name { get; set; }
    }

工作正常。 請注意,您的Equals函數必須被BoundingCircle類覆蓋。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM