抱歉,如果这是不正确的地方;我是一个非常新的业余程序员。
我目前的业余时间是从事小型自上而下的射击游戏,无非就是一个简单的自我驱动的项目,可以学习和玩耍。我正在使用C#和XNA作为框架,并且试图通过拾取gameObjects添加到清单中来为游戏添加一些变化。
目前,我只有一个List<GamePlayObjects>
“ WorldObjects”,我有一个ObjectManager
类管理所有对象的更新,碰撞和绘制函数,到目前为止,我对我所拥有的一切不满意。与GamePlayObject碰撞后(例如,小行星爆炸后可能是一小块铁矿石),它将从主列表“ WorldObjects”中删除该对象并将其添加到另一个名为List<GamePlayObjects> inventory
的列表中
现在,我要做的是在屏幕上绘制一个小区域,其中包含精灵项目和我已收集的项目总数。我对“绘图”方面不是很感兴趣,更多的是提取清单中的数据。
我已经阅读了几个关于可能使用HashSet
从清单中获取唯一项目,然后从HashSet
中提取每个项目的总数的主题,但是我现在正在努力理解这一点,因此我在这里访问了一些帮助。
我的代码示例以及我想实现的目标。
我有所有WorldObjects的列表,每个World Object是一个类,其中包含与该worlObject相关的所有内容。
private List<GamePlayObject> gameObjects = new List<GamePlayObject>();
当一个对象让我们说“玩家”与另一个对象“铁矿石”相撞时,我从以下位置删除了IronOre世界对象:
private List<GamePlayObject> gameObjects = new List<GamePlayObject>();
并将其添加到名为库存的新列表中
private List<GamePlayObject> playerInventory = new List<GamePlayObject>();
现在,随着越来越多的对象被收集并添加到我的库存中,我想提取信息并将有关我的库存的信息显示在屏幕上。
例如,在屏幕的右侧,我想显示库存中的物品清单以及每件物品的总量,这些数据应从库存清单中获取。
因此可能看起来像这样:
Iron Ore x 3
Steel x 10
Gold x 18
Uranium x 12
最佳答案
您可以使用List<T>
,然后使用List<T>.Remove
。但是,使用这样的List<T>
的问题是Remove
必须搜索整个列表,一次只能搜索一个项目,以找到要删除的项目。这也将导致发生大型复制,因为删除的元素之后的元素需要在内部数组中向下移动。
但是,像HashSet<T>
这样的集合可以非常快速地找到和删除项目,而无需复制。这要求您的类型实现GetHashCode
,但是如果您始终需要唯一的项,效果会更好。
对于您的两个馆藏,一种可能的选择是使用Dictionary<GamePlayObject, int>
,这将允许您快速查找并更改世界和库存中该类型对象的数量。同样,这将要求您的GamePlayObject
类重写object.GetHashCode
和object.Equals
,并实现IEquatable<GamePlayObject>
。