Advertisement
SilverTES

Dynamic Members reDefinition : C++

Jan 7th, 2017
175
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.11 KB | None | 0 0
  1. #include <iostream>
  2. #include <map>
  3.  
  4. template <class M = std::string, class E = int>
  5. E log(M msg, E error = 0)
  6. {
  7.     std::cout << msg;
  8.     return error;
  9. }
  10.  
  11. static int const POSITION = 10;
  12. static int const VELOCITY = 11;
  13.  
  14.  
  15. struct Component
  16. {
  17.     int _type;
  18.     virtual Component *clone() const = 0;
  19. };
  20.  
  21.  
  22. template <class DERIVED>
  23. struct ComponentHelper : public Component
  24. {
  25.  
  26.     virtual Component *clone() const
  27.     {
  28.         return new DERIVED(static_cast<const DERIVED&>(*this));
  29.     }
  30. };
  31.  
  32.  
  33. struct Position : public ComponentHelper<Position>
  34. {
  35.     int _x = 0;
  36.     int _y = 0;
  37.     int _z = 0;
  38.  
  39.     Position()
  40.     {
  41.         _type = POSITION;
  42.     }
  43.     Position(int x, int y, int z)
  44.     {
  45.         _type = POSITION;
  46.         _x = x;
  47.         _y = y;
  48.         _z = z;
  49.     }
  50. };
  51.  
  52. struct Velocity : public ComponentHelper<Velocity>
  53. {
  54.     int _x = 0;
  55.     int _y = 0;
  56.     int _z = 0;
  57.  
  58.     Velocity()
  59.     {
  60.         _type = VELOCITY;
  61.     }
  62.     Velocity(int x, int y, int z)
  63.     {
  64.         _type = VELOCITY;
  65.         _x = x;
  66.         _y = y;
  67.         _z = z;
  68.     }
  69. };
  70.  
  71. struct Entity
  72. {
  73.     std::string _name="";
  74.  
  75.     Entity *_parent = nullptr;
  76.  
  77.     std::map<int, Component*> _mapMember;
  78.  
  79.     static Entity *cloneOf(Entity *original)
  80.     {
  81.         Entity *clone = new Entity(*original);
  82.  
  83.         //clone = original;
  84.  
  85.         log ("--- Begin deep copy ---\n");
  86.  
  87.         std::map<int,Component*>::const_iterator it = original->_mapMember.begin();
  88.  
  89.         while (it != original->_mapMember.end())
  90.         {
  91.             //clone->_mapMember[it->first] = new Component(*(it->second));
  92.  
  93.             clone->_mapMember[it->first] = (*(it->second)).clone();
  94.  
  95.             it++;
  96.         }
  97.  
  98.         return clone;
  99.     }
  100.  
  101.     Entity(Entity *parent = nullptr, std::string name="")
  102.     {
  103.         _name = name;
  104.         _parent = parent;
  105.  
  106.         log("- Entity created !\n");
  107.     }
  108.     ~Entity()
  109.     {
  110.         std::map<int,Component*>::iterator it = _mapMember.begin();
  111.  
  112.         while (it != _mapMember.end())
  113.         {
  114.             if (it->second != nullptr)
  115.             {
  116.                 log ("- Delete Component:"+ std::to_string(it->second->_type) + " of Entity: " + _name + "\n");
  117.                 delete it->second;
  118.                 it->second = nullptr;
  119.             }
  120.  
  121.             it++;
  122.         }
  123.         _mapMember.clear();
  124.  
  125.         log("- Delete Entity: " + _name + "\n");
  126.     }
  127.  
  128.     void add(Component* component)
  129.     {
  130.         _mapMember[component->_type] = component;
  131.     }
  132.  
  133.  
  134.     template <class COMPONENT>
  135.     COMPONENT *get()
  136.     {
  137.         COMPONENT component;
  138.         return static_cast<COMPONENT*>(_mapMember[component._type]);
  139.     }
  140.  
  141.     void update()
  142.     {
  143.  
  144.     }
  145.     void render()
  146.     {
  147.         log("****************\n");
  148.         log("* Name = ");log(_name);log("\n");
  149.         log("****************\n");
  150.  
  151.         std::map<int,Component*>::iterator it = _mapMember.begin();
  152.  
  153.         while (it != _mapMember.end())
  154.         {
  155.             if (it->second != nullptr)
  156.             {
  157.  
  158.                 if (it->second->_type == POSITION)
  159.                 {
  160.                     log("--- Position ---\n");
  161.                     log("- x = ");log(get<Position>()->_x);log("\n");
  162.                     log("- y = ");log(get<Position>()->_y);log("\n");
  163.                     log("- z = ");log(get<Position>()->_z);log("\n");
  164.                 }
  165.  
  166.                 if (it->second->_type == VELOCITY)
  167.                 {
  168.                     log("--- Velocity ---\n");
  169.                     log("- x = ");log(get<Velocity>()->_x);log("\n");
  170.                     log("- y = ");log(get<Velocity>()->_y);log("\n");
  171.                     log("- z = ");log(get<Velocity>()->_z);log("\n");
  172.                 }
  173.             }
  174.             it++;
  175.         }
  176.     }
  177. };
  178.  
  179. int main()
  180. {
  181.  
  182. // Init
  183.  
  184.     Entity *player = new Entity(nullptr, "Mugen");
  185.  
  186.     player->add(new Position(10,20,30));
  187.     player->add(new Velocity(1,2,3));
  188.  
  189.     player->get<Position>()->_x = 99;
  190.     player->get<Position>()->_y = 88;
  191.  
  192.     player->get<Velocity>()->_z = 888888;
  193.  
  194.  
  195.     Entity *monster0 = new Entity(nullptr, "Monster");
  196.  
  197.     monster0->add(new Position(320,240,0));
  198.     monster0->add(new Velocity(77,55,33));
  199.  
  200.     monster0->get<Velocity>()->_x = -666;
  201.     monster0->get<Velocity>()->_y = -666;
  202.  
  203.     //monster0->get<Position>()->_z = 1111111;
  204.  
  205.     //Entity *copyPlayer = new Entity(nullptr, "MugenCopy");
  206.     Entity *copyPlayer = Entity::cloneOf(player);
  207.  
  208.     Entity *monster1 = Entity::cloneOf(monster0);
  209.     Entity *monster2 = Entity::cloneOf(monster0);
  210.  
  211.     monster1->get<Position>()->_z = 11111111;
  212.     monster1->get<Velocity>()->_z = 11111111;
  213.  
  214.     monster2->get<Position>()->_x = 22222222;
  215.     monster2->get<Position>()->_y = 22222222;
  216.     monster2->get<Position>()->_z = 22222222;
  217.  
  218.  
  219. // Render
  220.  
  221.     player->render();
  222.     copyPlayer->render();
  223.  
  224.     monster0->render();
  225.     monster1->render();
  226.     monster2->render();
  227.  
  228. // done
  229.  
  230.     delete player;
  231.     delete copyPlayer;
  232.  
  233.     delete monster0;
  234.     delete monster1;
  235.     delete monster2;
  236.  
  237.     return log("--- --- End of main OK --- ---\n");
  238. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement