我有一堆不同的npcs。它们都有不同的属性和不同的AI,所以我为每种类型创建了一个单独的类,并从基类Entity派生出来。我想这样做,以便我可以为每种类型的实体分配一个ID,所以我可以调用CreateNewEntity(int id,Vector2位置)。我该怎么做?我也有一种感觉,我设计得很糟糕。是真的
答案 0 :(得分:1)
从基础实体继承听起来像是一种好方法。所有对象之间共享的任何内容都应该在基本实体中,并且每种类型的NPC特有的任何内容都应该在它们自己的类中。具有相同目的但不同实现(如AI或CreateNewEntity)的事物应标记为虚拟,因此可以从基本实体列表中调用这些方法,但是将运行正确的实现。 CreateNewEntity应该是一个构造函数。
示例:
public class Entity
{
public int Id { get; protected set; }
public Vector2 Position { get; protected set; }
public int Strength { get; protected set; }
public Entity(int id, Vector2 position)
{
Id = id;
Position = position;
Strength = 1;
}
public virtual RunAI()
{
Position.X = Position.X + 1;
}
}
public class SuperHero
{
public SuperHero(int id, Vector2 position) : base (id, position)
{
Strength = 20;
}
public override void RunAI()
{
Position.X = Position.X + 500;
}
}
答案 1 :(得分:1)
有几种方法可以做到这一点。 您可以创建一个属性,为类型提供一些元数据,如ID e.g。
public class RenderableEntity{
}
[EntityTypeAttribute(Name = "Wizard"]
public class Wizard : RenderableEntity{
}
然后,您可以将它们全部捆绑在命名空间或逻辑容器中,并按如下方式创建类型 伪:
//Create Entity
//Type Name
string entityName = "Wizard";
//Get the Type
from the namespace where the type has the custom attribute applied to it. Get the type
//Activator.Create(typeof(TheWizardType))
另一个是你可以获得名称与传递给你的create方法的字符串相匹配的Type。
答案 2 :(得分:0)
听起来像flyweight模式在这里是有益的:http://www.primos.com.au/primos/Default.aspx?PageContentID=27&tabid=65
您可能希望区分使每个实体不同的核心状态,然后尽可能多地放在共享实例中。