我正在制作这个2-D游戏,我希望能够构建结构。玩家必须能够从某些结构中受益。今天游戏看起来像这样:
(蓝点是玩家,其他点是ais)
我创建了一个名为Structure的类和其他三个继承自Structure的类。这些类或多或少是空的。游戏的牌块有自己的名为Tile的类。在这堂课中,我写了一些东西,但感兴趣的代码就是:
public LinkedList<Structure> Structures = new LinkedList<Structure>();
当我构建一个结构(例如壁炉)时,代码如下所示:
Bundle.map.tile[Bundle.player.X, Bundle.player.Y].Structures.
AddFirst(new Fireplace());
我不确定的部分是我如何检查列表是否包含壁炉(例如名为Fireplace的类)或任何其他建筑物。例如,如果玩家在瓷砖上找到壁炉,他/她将恢复温暖。这不起作用。也许我对所有这些都采取了错误的方法,在任何一种情况下,请提供代码示例。
答案结论:
bool anyFireplace = Bundle.map.tile[Bundle.player.X, Bundle.player.Y].Structures.OfType<Fireplace>().Any();
if (anyFireplace)
{
Warmth = MaxWarmth;
}
else
{
if (Warmth > 0)
{
Warmth--;
}
else
{
HP--;
}
}
答案 0 :(得分:2)
我建议使用is
关键字。它用于检查变量是否具有某种类型。例如:
object example = "Hello World!";
bool isString = example is string; // Evaluates to true
您可以在代码中使用它:
foreach (Structure s in Structures)
{
if (s is FirePlace)
{
// Warmup the player
}
}
此外,我建议使用List<T>
代替LinkedList<T>
,因为List<T>
(通常)much faster。
正如你可能从其他一些答案中得到的那样,多种方式可以通过多种方式引领罗马。但是,根据this测试,is
这样做的方式优于所有其他建议方式(感谢Hogan btw进行此测试):
OfType时间:.6702958, GetType时间:.2268946, 物业时间:.1400208, 是时候了:.1112995
这样is
更清洁恕我直言。
答案 1 :(得分:2)
您可以使用Enumerable.OfType<TResult>()
和Enumerable.Any(TSource)
,如下所示:
LinkedList<Structure> structures = new LinkedList<Structure>();
// Add Different Types of Structures
Boolean anyFireplace = structures.OfType<Fireplace>().Any();
请确保您拥有:
using System.Linq;
在源代码顶部的using指令中,以及对System.Core程序集模块的引用。如果你需要知道LinkedList中的壁炉的确切数量,你也可以使用Count()方法,否则Any()在Linq对象中更有效。
答案 2 :(得分:1)
您可以使用LINQ to Objects:
LinkedList<Structure> list = ...
List<Fireplace> fireplaces = list.OfType<Fireplace>().ToList();
fireplaces
是类型Fireplace
列表中所有元素的列表 - 如果不存在则为空列表。
如果您只是想知道一个是否存在,您可以将其调整为:
bool hasFirplace = list.OfType<Fireplace>().Any();
答案 3 :(得分:0)
也许不建议使用类名描述对象。你将不得不使用有点慢的反射。你只得到一个描述(类名)。你需要的不仅仅是一个。您可能需要考虑这样的基础对象:
public abstract class MapObject
{
public int x,y; // object location
public string myclass; // object class
public string mytype; // object type
// etc
// constructor
public MapObject(string myclass, string mytype);
}
然后壁炉可能看起来像这样
public class FirePlace : MapObject
{
public FirePlace()
: base("Builtin furniture", "Fireplace") { }
// etc
}
现在你可以遍历mytype =“Fireplace”的所有MapObjects
答案 4 :(得分:-1)
您可以使用类型来了解:
foreach(var s in Structures)
{
var type = s.GetType();
if(type == typeof(FirePlace)
{
(your code here)
}
}
对于单一方法
public bool HasType<T>(IEnumerable<T> list, Type t)
{
return list.Any(e=>e.GetType() == t);
}
用法应该是:
if(HasType(Structures,typeof(FirePlace))
{
(code here)
}
最后你可以把它变成一个扩展方法,但我把那个选项留给你;)