2011-07-15 90 views
0

我有一堆不同的npcs。它们都具有不同的属性和不同的AI,因此我为每个类型创建了一个单独的类,并从基类实体派生它。我想使它能够为每种类型的实体分配一个ID,因此我可以调用CreateNewEntity(int id,Vector2位置)。我将如何做到这一点?我也有一种感觉,我设计得很糟糕。这是真的吗?基于ID的NPC系统

+0

一般而言,继承不是设置属性和行为的好选择。相反,聚合是对其进行建模的更好方式。我没有很好的提及你,所以我发表评论。尝试寻找“游戏开发继承与聚合” – renatopp

回答

1

有一对夫妇,你可以做到这一点的方式。 您可以创建一个属性,为该类型提供一些元数据,例如ID

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)) 

另一种是,你可以只拿到类型的名称相匹配,其中您传递给您的创建方法的字符串。

+0

在这种情况下属性的附加值是多少?只有在使用反射查询类型的元数据时才会考虑属性。这被认为是一个昂贵的操作,为什么在这种情况下需要? –

+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; 
    } 
} 
+0

我得到你在这里做什么,但我希望id引用对象的类型。所以每当我创建一个ID为1的实体时,它就会成为一个超级英雄,2它将成为一只蜘蛛。 – Raj