2011-07-15 8 views
0

私はさまざまなnpcsを持っています。それらはすべて異なるプロパティと異なるAIを持っているので、私は各タイプごとに別のクラスを作り、それを基本クラスのEntityから派生させました。私はEntityの各タイプにIDを割り当てることができるようにしたいので、CreateNewEntity(int id、Vector2 position)を呼び出すことができます。どうすればいい?私はまた、これをひどく設計していると感じています。それは本当ですか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)) 

を他のはあなただけの名前が一致するタイプを得ることができるということですあなたがcreateメソッドに渡した文字列

+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

関連する問題