Advertisement
Guest User

Untitled

a guest
Jan 22nd, 2020
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.80 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. class IComponent {
  5. public:
  6.     virtual uint32_t GetID() const = 0;
  7. };
  8.  
  9. template <uint32_t ID>
  10. class Component : public IComponent {
  11. public:
  12.     virtual ~Component() { }
  13.  
  14. public:
  15.     constexpr static size_t TypeID = (1u << ID);
  16.     virtual size_t GetID() const override { return TypeID; }
  17. };
  18.  
  19. class RenderComponent : public Component<0> {
  20. public:
  21.     virtual ~RenderComponent() { }
  22.  
  23. public:
  24.     uint32_t m_vboID;
  25. };
  26.  
  27. class PhysicsComponent : public Component<1> {
  28. public:
  29.     virtual ~PhysicsComponent() { }
  30.  
  31. public:
  32.     float m_Speed;
  33.     float m_Size;
  34. };
  35.  
  36. class PositionComponent : public Component<2> {
  37. public:
  38.     virtual ~PositionComponent() { }
  39.  
  40. public:
  41.     float m_X, m_Y, m_Z;
  42. };
  43.  
  44. class Entity {
  45. public:
  46.     Entity()
  47.         : m_Mask(NULL), m_ID(0xFFFFFFFF)
  48.     {
  49.  
  50.     }
  51.  
  52.     virtual ~Entity() { }
  53.  
  54. public:
  55.     void AddComponent(IComponent* component)
  56.     {
  57.         m_Mask |= component->GetID();
  58.         m_Components.push_back(component);
  59.     }
  60.  
  61. public:
  62.     uint32_t m_ID;
  63.     uint32_t m_Mask;
  64.     std::vector<IComponent*> m_Components;
  65. };
  66.  
  67. class IProcessor {
  68. public:
  69.     virtual void Process(std::vector<Entity*>& entities) = 0;
  70. };
  71.  
  72. template <class Type, uint32_t Mask>
  73. class Processor : public IProcessor {
  74. public:
  75.     virtual ~Processor() { }
  76.  
  77. public:
  78.     virtual void Process(std::vector<Entity*>& entities)
  79.     {
  80.         for (auto entity : entities)
  81.         {
  82.             if ((entity->m_Mask & Mask) == Mask)
  83.             {
  84.                 static_cast<Type*>(this)->Process(*entity);
  85.             }
  86.         }
  87.     }
  88. };
  89.  
  90. class PhysicsProcessor : public Processor<PhysicsProcessor, PhysicsComponent::TypeID | PositionComponent::TypeID> {
  91. public:
  92.     virtual ~PhysicsProcessor() { }
  93.    
  94. public:
  95.     virtual void Process(Entity& entity)
  96.     {
  97.         printf("PhysicsAndMovement %d\n", entity.m_ID);
  98.     }
  99. };
  100.  
  101. class EntityManager {
  102. public:
  103.     virtual ~EntityManager() { }
  104.  
  105. public:
  106.     void SetProcessor(IProcessor* processor)
  107.     {
  108.         m_Processors.push_back(processor);
  109.     }
  110.  
  111.     void Update(float delta)
  112.     {
  113.         for (auto processor : m_Processors)
  114.         {
  115.             processor->Process(m_Entities);
  116.         }
  117.     }
  118.  
  119.     Entity* CreateEntity()
  120.     {
  121.         Entity* nEntity = new Entity();
  122.         nEntity->m_ID = m_Entities.size() + 1;
  123.         m_Entities.push_back(nEntity);
  124.         return nEntity;
  125.     }
  126.  
  127. private:
  128.     std::vector<IProcessor*> m_Processors;
  129.     std::vector<Entity*> m_Entities;
  130. };
  131.  
  132. int main(int argc, char* argv[])
  133. {
  134.     EntityManager manager;
  135.     IProcessor* a = new PhysicsProcessor();
  136.     manager.SetProcessor(a);
  137.  
  138.     Entity* entityA = manager.CreateEntity();
  139.  
  140.     PhysicsComponent pC;
  141.     pC.m_Size = 2.0f;
  142.     pC.m_Speed = 1.0f;
  143.    
  144.     RenderComponent rC;
  145.     rC.m_vboID = 5;
  146.  
  147.     PositionComponent psC;
  148.     psC.m_X = 23.5f;
  149.     psC.m_Y = 1.0f;
  150.     psC.m_Z = 500.2f;
  151.  
  152.     entityA->AddComponent(&pC);
  153.     entityA->AddComponent(&rC);
  154.     entityA->AddComponent(&psC);
  155.    
  156.     manager.Update(16.666f);
  157.    
  158.     system("PAUSE");
  159.     return EXIT_SUCCESS;
  160. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement