列表填充问题

本文关键字:问题 填充 列表 | 更新日期: 2023-09-27 18:26:25

这种情况发生在我身上不止一次,我不知道它可能是什么。我有一个手工制作食谱的列表,我这样添加:

        ItemRecipe firePitRecipe = new ItemRecipe();
        firePitRecipe.Items.Add(new Rock());
        foreach (Item item in firePitRecipe.Items)
        {
            item.ItemCount = 5;
        }
        firePitRecipe.Output = new FirePit();
        firePitRecipe.Name = "firepit";
        CraftingList.Add(firePitRecipe);

我目前有6个食谱在清单上。当我尝试制作一件物品时,盒子里没有显示我可用的工艺品。当我评论出这行和最后两个食谱时:

//firePitRecipe.Items.Add(new Rock());

一切正常。我不知道这个错误可能是什么。是因为我每次添加到配方中都会创建一个新的项目实例吗。项目?

      public class Rock : Item
{
    Texture2D texture;
    public Rock()
    {
        this.Texture = texture;
        ItemName = "rock";
        ItemType itemType = ItemType.craft;
    }
    public Rock(Vector2 position)
    {
        texture = Content.Load<Texture2D>("rock");
        this.Position = position;
        this.Texture = texture;
        ItemName = "rock";
        ItemType itemType = ItemType.craft;
        ItemPickedUp = false;
    }
}

这是我的摇滚课,我所有的其他项目都很相似。这没什么奇怪的,所以我看不出有什么不对。设置断点会显示我的制作列表中没有一个项目为空。

另一件事可能是,当我循环浏览列表,并将其与我库存中的物品进行核对时,但我对此表示怀疑。

我把它缩小到几个方法。它们只是没有在表中正确绘制或设置。

 private void SetItemPositionInTable(Player player, Item output)
    {
        for (int i = 0; i < CraftingTableItems.Count(); i++)
        {
            if (CraftingTableItems[i].ItemName == "empty")
            {
                CraftingTableItems[i].ItemName = output.ItemName;
                CraftingTableItems[i].Texture = output.Texture;
                Console.WriteLine(output.ItemName);
                break;
            }
            else if (CraftingTableItems[i].ItemName == output.ItemName)
            {
                break;
            }
            else if (CraftingTableItems[i].ItemName != "empty" && output.ItemName == "empty")
            {
                CraftingTableItems[i].ItemName = "empty";
            }
        }
    }
  public void DrawCraftingTable(SpriteBatch sb, Player player, SpriteFont font)
    {
        if (player.DrawCraftingTable == true)
        {
            sb.Draw(Texture, CraftingRectangle, Color.White);
            foreach (Item item in CraftingTableItems)
            {
                if (item.ItemName != "empty")
                {
                    sb.Draw(item.Texture, item.ItemSlotPosition, Color.White);
                }
            }
        }
    }

我很困惑,因为这适用于列表中的3项,但不适用于6项?这是手工制作表。

              CraftingTableItems = new List<Item>(12);
        for (int x = 0; x < 4; x++)
        {
            for (int y = 0; y < 3; y++)
            {
                CraftingTableItems.Add(new Item(new Vector2((int)(64 * x), (int)(64 * y)), "empty"));
            }
        }

列表填充问题

我认为您没有给我们足够的代码来了解出了什么问题。这件事引起了我的注意:

public class Rock : Item
{
    Texture2D texture;  // This isn't initialized so it is null?
    public Rock()
    {
        this.Texture = texture;  // Here the assumed null is assigned to base class Texture
        ItemName = "rock";
        ItemType itemType = ItemType.craft;
    }
    ...

因为您使用new Rock()创建岩石,所以根据您向我们展示的内容,this.Texture将保持为空。稍后绘制该岩石时,可能会因为缺少纹理而失败。