2013-11-26 3 views
0

Я абсолютно потерял при попытке переноса Richard Lord's Ash Framework на «чистый» C++ (MSVC Express 2008) или, по крайней мере, я не смог найти какую-либо реализацию, Я беспорядок с помощью boost: fusion libs для реализации требований к минимальной рефлексии, которые требуются инфраструктурам, но метапрограммирование шаблона для меня стало новым, и я переполняю ошибки компилятора и длительные испытания отказа :(C++: Внедрение структуры «ясень» Entity framework

Кто-нибудь знает о осуществимость или полезность для переноса рамки?

Взяв класс Entity в качестве примера, мог ли кто-нибудь уточнить, как я могу достичь результата вроде:

(ЭТО FLEX КОД!)

waitEntity = new Entity("wait") 
      .add(new WaitForStart(waitView)) 
      .add(new Display(waitView)) 
      .add(new Position(0, 0, 0)); 

с implementaton C++, как это?

... 
    namespace bf = boost::fusion; 
    namespace bm = boost::mpl; 

    template<typename ComponentMap> 
    class EntityASH{ 
    public: 
    EntityASH(ComponentMap c) 
    :m_components(c){ } 
    //"fusion-style" trying to return a new Components template entity for a new component type 
    template<typename T> 
    EntityASH 
    template<typename T> 
/*¿Here im absoltely lost 
      EntityASH< 
      result_of::as_map< 
        typename result_of::push_back<ComponentMap, 
        fusion::pair<T,T> 
        >::type 
        > 
      >*/ 
    EntityASH *add(){ 
      typedef bf::pair<T, T> newTentryPair; 
      //bf::as_map(bf::push_back<ComponentMap,newTentryPair>(m_components,newTentryPair())); 

      return new EntityASH(bf::as_map(bf::push_back<ComponentMap,newTentryPair>(m_components,newTentryPair()))); 

...

ответ

0

Конструктор в C++ не может вернуть что-то, поэтому вы должны использовать другой метод, чтобы создать объект посредством CreateEntity() возвращает ссылку или зЬй :: shared_ptr хозяйствующего субъекта объект.

Я не вижу никаких преимуществ в использовании шаблонов здесь, потому что хранение ссылок на компоненты, кажется более правильным для меня, потому что компоненты части entitys и не относятся к объекту:

std::shared_ptr<Entity> createEntity() { 
    return std::make_shared<Entity>(); 
} 

... 

std::shared_ptr<Entity> addComponent(ComponentBase comp) { 
    mComponents.add(comp); 
    return shared_from_this(); 
} 

... 

createEntity().add(new Position()) 
      .add(new Display()) 
      .add(new Position()); 

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

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

+0

Теперь я понимаю вашу точку лучше, как я сказал в своем посте, я полностью отключился, пытаясь реализовать эту структуру. Я искал учебник FLex в качестве основы для имитации C++, но это была непростая задача. Прямо сейчас я борюсь с сериализацией/частью отражения и не вижу другого способа реализовать его, чем писать парсер, используя boost: spirit для достижения того же результата ... – user2996040

+0

Возможно, ориентированный на данные дизайн - хорошее ключевое слово для вас. Сериализация действительно проста при использовании принципов, ориентированных на данные. Для отражения вы можете использовать std :: type_index и/или std :: type_info и оператор type_id. – DarthB