[英]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 Pop
和BoundingCircle.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.