我正在为游戏开发玩家库存系统。
我有一个 struct Slot,它有一个 List<Loot> 集合,表示其中允许使用哪些类型的项目。抽象类Loot是所有可抢劫物品的子类 - 即:将是Slot结构的有效内容值。
我想表达的是,一个Slot可以限制它可以包含哪些Loot子类。例如,如果Slot代表一个弹药容器,我希望它只包含作为弹药容器的Loot子类,例如“Quivers”和“Shot Pouches”(它将沿线某处子类化Container )。
战利品类
public abstract class Loot : GameEntity, ILootable
{
public int MaxUnitsPerStack { get; set; }
public int MaxUnitsCarriable { get; set; }
public int MaxUnitsOwnable { get; set; }
public void Stack() { }
public void Split() { }
public void Scrap() { }
}
容器类
public abstract class Container : Loot
{
public List<Slot> Slots { get; set; }
public Container(int slots)
{
this.Slots = new List<Slot>(slots);
}
}
插槽结构
public struct Slot
{
public Loot Content;
public int Count;
public List<Loot> ExclusiveLootTypes;
public Slot(Loot[] exclusiveLootTypes)
{
this.Content = null;
this.Count = 0;
List<Loot> newList;
if (exclusiveLootTypes.Count() > 0)
{
newList = new List<Loot>(exclusiveLootTypes.Count());
foreach (Loot l in exclusiveLootTypes)
{
newList.Add(l);
}
}
else { newList = new List<Loot>(); }
this.ExclusiveLootTypes = newList;
}
}
玩家库存
public struct PlayerInventory
{
static Dictionary<Slot, string> Slots;
static void Main()
{
Slots = new Dictionary<Slot, string>();
/* Add a bunch of slots */
Slots.Add(new Slot(/* I don't know the
syntax for this:
Quiver, Backpack */), "Backpack"); // Container
}
}
我不知道如何在PlayerInventory类的 Main 方法中的Slot构造函数调用中为 Loot 子类提供参数。
我希望这很清楚。提前致谢。
编辑
我能够使用 David Sieler 的方法和一些反射来解决这个问题(我的意思是让它编译)。
插槽结构
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
public struct Slot
{
private Loot _content;
private int _count;
public List ExclusiveLootTypes;
public Loot Content
{
get { return _content; }
private set
{
if ((ExclusiveLootTypes.Contains(value.GetType())) && (value.GetType().IsSubclassOf(Type.GetType("Loot"))))
{
_content = value;
}
}
}
public int Count
{
get { return _count; }
set { _count = value; }
}
public Slot(params Type[] exclusiveLootTypes)
{
this._content = null;
this._count = 0;
List newList;
if (exclusiveLootTypes.Count() > 0)
{
newList = new List(exclusiveLootTypes.Count());
foreach (Type l in exclusiveLootTypes)
{
newList.Add(l);
}
}
else { newList = new List(); }
this.ExclusiveLootTypes = newList;
}
}
PlayerInventory 调用 Slot 构造函数
Slots.Add(new Slot(typeof(Backpack)));
再次感谢大家的讨论。