Система NPC на основе ID - PullRequest
       24

Система NPC на основе ID

0 голосов
/ 15 июля 2011

У меня есть куча разных NPC.Все они имеют разные свойства и разный AI, поэтому я создал отдельный класс для каждого типа и извлек его из базового класса Entity.Я хочу сделать так, чтобы я мог назначить идентификатор каждому типу сущности, чтобы я мог просто вызвать CreateNewEntity (int id, Vector2 position).Как бы я это сделал?У меня также есть ощущение, что я плохо это проектирую.Это правда

Ответы [ 3 ]

1 голос
/ 15 июля 2011

Есть несколько способов сделать это.Вы можете создать Атрибут, который даст типу некоторые метаданные, например, 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))

Другой способ заключается в том, что вы можете просто получить тип, имя которого соответствует строке, переданной вами в метод создания.

1 голос
/ 15 июля 2011

Наследование от базовой сущности звучит как хороший подход.Все, что совместно используется всеми вашими объектами, должно быть в базовой сущности, а все, что является специфическим для каждого типа 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 голосов
/ 17 июля 2011

Звучит так, будто здесь будет полезна модель с навесом: http://www.primos.com.au/primos/Default.aspx?PageContentID=27&tabid=65

Вы, вероятно, хотите разграничить основное состояние, которое отличает каждую сущность, и затем поместить как можно больше в общий экземпляр.

...