RPG清单:添加和删除项目

时间:2013-02-23 00:23:49

标签: c# game-engine

到目前为止,我有这个:

class Inventory {
     private Potion[] potions;
     private Weapon[] weapons;
     private Armor[]  armor;
     private Food[]   food;
     private Ore[] ores;

     public int InventorySlots {get;set;}
     public Inventory() {
            InventorySlots = 10;
            BuildInventory();
     }
     public Inventory(int slots) {
            InventorySlots = slots;
            BuildInventory();
     }
     public void BuildInventory() {
            potions = new Potion[InventorySlots];
            weapons = new Weapons[InventorySlots];
            armor = new Armor[InventorySlots];
            food = new Food[InventorySlots];
            ores = new Ore[InventorySlots]
     }
}
例如,我想在10插槽库存中添加新武器,如何添加并删除它?

4 个答案:

答案 0 :(得分:5)

为了显着简化问题,您可以创建一个基类“项目”,其中所有项目类型都来自:

public class Item
{
    // put any common attributes here
}

public class Armor : Item
{
    // define properties for Armor here
}

public class Weapon : Item
{
    // define properties for weapons here
}

当您创建这样的子类时,您可以使用Item变量来存储任何派生类。您可以创建一个新的Weapon实例,并将其分配给类型为Item的库存槽。因此,您的Inventory课程将成为Item s。

的集合

假设你想要一个一对一的数组到库存位置的映射,并且不希望自己重新排列,那么数组方法可能就是这样。

class Inventory
{
    // Array to store items
    public Item[] Items { get; private set; }

    // Inventory capacity is array length
    public int Capacity { get { return (Items == null) ? 0 : Items.Length; } }

    // Constructor
    public Inventory(int capacity = 10)
    {
        SetInventorySize(capacity);
    }

    // Set size of inventory, retaining contents where possible
    public void SetInventorySize(int cap)
    {
        if (cap <= 0)
            Items = null;
        else if (Items == null)
            Items = new int[cap];
        else
            Array.Resize(ref Items, cap);
    }

    // Get index number of first free slot in inventory
    public int FirstAvail()
    {
        if (Items != null)
        {
            for (int i = 0; i < Items.Length; ++i)
            {
                if (Items[i] == null)
                    return i;
            }
        }
        return -1;
    }

    // Add item to array, returning index or -1 on failure
    public int AddItem(Item item)
    {
        if (Items != null)
        {
            for (int i = 0; i < Items.Length; ++i)
            {
                if (Items[i] == null)
                {
                    Items[i] = item;
                    return i;
                }
            }
        }
        return -1;
    }
}

Items属性是一个数组,您可以存储任何Item派生的对象,例如上面的ArmorWeapon。要将项目添加到列表中,请找到一个清晰的位置(例如,使用FirstAvail方法)并将该项目放入项目列表中。

当您在清单中使用项目时,您需要确定它们是什么,以确定如何处理它们。您可以这样使用as操作:

// get the first item in the inventory
Item item = inventory.Items[0];

if ((Armor armorItem = item as Armor) != null)
{
    // Code to execute for Armor items
    armorItem.Wear();
}
else if ((Weapon weaponItem = item as Weapon) != null)
{
    // Code to execute for Weapon items
    weaponItem.Equip();    
}
else if ((Potion potionItem = item as Potion) != null)
{
    // Code to execute for Potion items
    potionItem.Drink();
}

as操作将检查对象的真实类型,如果不匹配则返回null。因此,如果您在广告资源的第0个插槽中存储Potion项,则不会尝试将其用作ArmorWeapon项。

当然这是一个人为的例子。在Item类中定义基本的常用操作并在子类中覆盖它们会更有用。然后你只需调用(例如)item.DefaultAction()并为每个子类型重写DefaultAction的实现,以执行适当的操作。

答案 1 :(得分:1)

看起来你将无法将你的武器设置在Inventory类之外,因为它是私有的,但是如果你在Inventory类中执行它,因为它是一个数组,你只需将武器分配给武器的索引阵列。要删除它,只需将武器索引设置为null。

weapons[index] = weapon;  // add
weapons[index] = null;  // remove

答案 2 :(得分:0)

在数组位置使用对象之前,请确保检查 null

if (potions[4] != null)
{
    potions[4].DrinkMe();
}

您可以通过重新分配 null

来删除项目
potions[4] = null;

请注意,所有数组位置都将以 null 开头。代码:

potions = new Potion[InventorySlots];

分配Potion数组,但不在每个数组槽中放置新的Potion实例。你应该这样做。

答案 3 :(得分:0)

我个人只是将这些公开

private Potion[] potions;
private Weapon[] weapons;
private Armor[]  armor;
private Food[]   food;
private Ore[] ores;

但是如果你想把它们保密,那就制定方法来访问不同数组的不同位置。

实施例

public Weapon getWeaponAtPositon(int index)
{
    if (index > 0 && index < InventorySlots)
        return weapons[index];
    else
        return null;
}

public void setWeaponAtPositon(Weapon weapon, int index)
{
    if (weapon != null && index > 0 && index < InventorySlots)
        weapons[index] = weapon;
}

public void deleteWeaponAtPositon(int index)
{
    if (index > 0 && index < InventorySlots)
        weapons[index] = null;
}

你可以为你拥有的不同阵列重复这些,这样你一次只能访问一个字段,这样你就可以更安全地从课堂外修改数组(甚至更不容易弄乱它)虽然它仍然很容易)

希望它有所帮助。