2015-05-14 3 views
1

Я пытаюсь работать с пользовательской платформой Entity System Framework для разработки игры. По существу, что я пытаюсь сделать с этим, есть классы Component и Component System, из которых вы можете получить дополнительные классы. Я действительно не уверен, как напрямую объяснить, что это такое, что я пытаюсь сделать, поэтому я собираюсь скопировать и вставить свой код здесь, а затем попытаться сформулировать конкретный вопрос в конце.C# несколько классов с использованием дженериков и

Компонент

public class Component 
{ 
    public Entity entity; 

    public Component() { } 

    public Component(Entity e) 
    { e.AddComponent(this); } 
} 

System Component

public class ComponentSystem<T> where T : Component 
{ 
    protected List<T> components; 

    public void AddComponent(T com) 
    { 
     this.components.Add(com); 
    } 

    public void RemoveComponent(T com) 
    { 
     this.components.Remove(com); 
    } 

    public void Update(double timeDelta = 0.0f) 
    { 
    } 
} 

Как Main теперь

public Main(string[] args) 
{ 
    TagSystem Tags = new TagSystem(); 
    GroupSystem Groups = new GroupSystem(); 

    Entity e = new Entity(); 
    e.AddComponent(new TagComponent("UniqueID")); 
    e.AddComponent(new GroupComponent()); 

    Tags.AddComponent(e.GetComponent<TagComponent>()); 
    Groups.AddComponent(e.GetComponent<GroupComponent>()); 
} 

Как бы мне хотелось посмотреть Основное

public Main(string[] args) 
{ 
    TagSystem Tags = new TagSystem(); 
    GroupSystem Groups = new GroupSystem(); 

    Entity e = new Entity(); 
    e.AddComponent(new TagComponent(Tags, "UniqueID")); 
    e.AddComponent(new GroupComponent(Groups)); 

    // Or this? 
    Entity e = new Entity(); 
    e.AddComponent(new TagComponent<TagSystem>(Tags, "UniqueID")); 
    e.AddComponent(new GroupComponent<GroupSystem>(Groups)); 
} 

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

public void AddToSystem<T, U>(T sys) where T : ComponentSystem<U> 
{ sys.AddComponent(this); } 
public void AddToSystem<T>(T sys) 
{ sys.AddComponent(this); } // fails because T has no method AddComponent 

ответ

2

Разумная конструкция может заключаться в том, чтобы превратить ComponentSystem в Factory.

Таким образом, всякий раз, когда компонент запрашивается для экземпляра объекта, он будет отслеживать экземпляры компонентов, которые он передает. Вы можете использовать Dependency Injection для инициализации компонента.

Существует некоторые накладные расходы:

  1. Вы должны зарегистрировать объекты, которые производятся на заводе-изготовителе (типы поэтому компонент не будут подключены к системе компонентов)
  2. Вам нужно определить интерфейс для компоненты (или базовый класс, если все компоненты будут иметь одинаковую функциональность) для реализации, поэтому система компонентов знает, что с ними делать.
  3. Вам необходимо указать систему компонентов для удаления экземпляров или память, занятую система компонентов будет навсегда расти

Просто некоторые мысли

+0

Hm, это может быть жизнеспособным решением в будущем, но я в конечном итоге делает что-то другое. Я наткнулся на этот ответ http://stackoverflow.com/questions/353126/c-sharp-multiple-generic-types-in-one-list, который привел меня к разработке только статического глобального списка систем, и это может позволить мне использовать ComponentSystem где угодно, так как это базовый класс. – Hondros

Смежные вопросы