Advertisement
SilverTES

Dynamic Entity reDefinition : C++

Jan 7th, 2017
147
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.71 KB | None | 0 0
  1. #include <iostream>
  2. #include <map>
  3. #include <functional>
  4.  
  5. template <class M = std::string, class E = int>
  6. E log(M msg, E error = 0)
  7. {
  8.     std::cout << msg;
  9.     return error;
  10. }
  11.  
  12. //static int const POSITION = 1;
  13. //static int const VELOCITY = 2;
  14.  
  15. enum
  16. {
  17.     POSITION = 10,
  18.     VELOCITY
  19. };
  20.  
  21.  
  22. struct Component
  23. {
  24.     int _type;
  25.     virtual Component *clone() const = 0;
  26.     virtual ~Component() // Avoid warning when we want to delete Component !
  27.     {
  28.  
  29.     }
  30. };
  31.  
  32.  
  33. template <class DERIVED>
  34. struct ComponentHelper : public Component
  35. {
  36.     virtual Component *clone() const
  37.     {
  38.         return new DERIVED(static_cast<const DERIVED&>(*this));
  39.     }
  40. };
  41.  
  42.  
  43. struct Position : public ComponentHelper<Position>
  44. {
  45.     int _x;
  46.     int _y;
  47.     int _z;
  48.  
  49.     Position(int x = 0, int y = 0, int z = 0)
  50.     {
  51.         _type = POSITION;
  52.         _x = x;
  53.         _y = y;
  54.         _z = z;
  55.     }
  56. };
  57.  
  58. struct Velocity : public ComponentHelper<Velocity>
  59. {
  60.     int _x;
  61.     int _y;
  62.     int _z;
  63.  
  64.     Velocity(int x = 0, int y = 0, int z = 0)
  65.     {
  66.         _type = VELOCITY;
  67.         _x = x;
  68.         _y = y;
  69.         _z = z;
  70.     }
  71. };
  72.  
  73. struct Entity
  74. {
  75.     std::string _name="";
  76.  
  77.     Entity *_parent = nullptr;
  78.  
  79.     std::map<int, Component*> _mapMember;
  80.  
  81.     std::function<void(Entity*)> _update = nullptr;
  82.     std::function<void(Entity*)> _render = nullptr;
  83.  
  84.     void setUpdate(std::function<void(Entity*)> update)
  85.     {
  86.         _update = update;
  87.     }
  88.  
  89.     void setRender(std::function<void(Entity*)> render)
  90.     {
  91.         _render = render;
  92.     }
  93.  
  94.  
  95.     static Entity *cloneOf(Entity *original, std::string name = "")
  96.     {
  97.  
  98.  
  99.         Entity *clone = new Entity(*original);
  100.  
  101.         if (name == "")
  102.             clone->_name = original->_name;
  103.         else
  104.             clone->_name = name;
  105.  
  106.  
  107.         //clone = original;
  108.         log ("--- Begin deep copy ---\n");
  109.         std::map<int,Component*>::const_iterator it = original->_mapMember.begin();
  110.  
  111.         while (it != original->_mapMember.end())
  112.         {
  113.             //clone->_mapMember[it->first] = new Component(*(it->second));
  114.             clone->_mapMember[it->first] = (*(it->second)).clone();
  115.             it++;
  116.         }
  117.         return clone;
  118.     }
  119.  
  120.     Entity(Entity *parent = nullptr, std::string name="")
  121.     {
  122.         _name = name;
  123.         _parent = parent;
  124.  
  125.         log("- Entity created !\n");
  126.     }
  127.     virtual ~Entity()
  128.     {
  129.         std::map<int,Component*>::iterator it = _mapMember.begin();
  130.  
  131.         while (it != _mapMember.end())
  132.         {
  133.             if (it->second != nullptr)
  134.             {
  135.                 log ("- Delete Component:"+ std::to_string(it->second->_type) + " of Entity: " + _name + "\n");
  136.                 delete it->second;
  137.                 it->second = nullptr;
  138.             }
  139.  
  140.             it++;
  141.         }
  142.         _mapMember.clear();
  143.  
  144.         log("- Delete Entity: " + _name + "\n");
  145.     }
  146.  
  147.     void add(Component* component)
  148.     {
  149.         _mapMember[component->_type] = component;
  150.     }
  151.  
  152.     void del(int type)
  153.     {
  154.         delete _mapMember[type];
  155.         _mapMember.erase(type);
  156.     }
  157.  
  158.  
  159.     template <class COMPONENT>
  160.     COMPONENT *get()
  161.     {
  162.         COMPONENT component;
  163.         return static_cast<COMPONENT*>(_mapMember[component._type]);
  164.     }
  165.  
  166.     void update()
  167.     {
  168.         if (_update != nullptr)
  169.             _update(this);
  170.         else
  171.             log("- Entity update() not defined !\n");
  172.     }
  173.  
  174.     void render()
  175.     {
  176.  
  177.  
  178.         if (_render != nullptr)
  179.             _render(this);
  180.         else
  181.             log("- Entity render() not defined !\n");
  182.  
  183.     }
  184. };
  185.  
  186. Entity * createPlayer(Entity *parent, std::string name)
  187. {
  188.     Entity *entity = new Entity(parent, name);
  189.  
  190.     entity->add(new Position());
  191.     entity->add(new Velocity());
  192.  
  193.     return entity;
  194. }
  195.  
  196. void showMe(Entity * entity)
  197. {
  198.     log("****************\n");
  199.     log("* Name = ");log(entity->_name);log("\n");
  200.     log("****************\n");
  201.  
  202.     std::map<int,Component*>::iterator it = entity->_mapMember.begin();
  203.  
  204.     while (it != entity->_mapMember.end())
  205.     {
  206.         if (it->second != nullptr)
  207.         {
  208.  
  209.             if (it->second->_type == POSITION)
  210.             {
  211.                 log("--- Position ---\n");
  212.                 log("- x = ");log(entity->get<Position>()->_x);log("\n");
  213.                 log("- y = ");log(entity->get<Position>()->_y);log("\n");
  214.                 log("- z = ");log(entity->get<Position>()->_z);log("\n");
  215.             }
  216.  
  217.             if (it->second->_type == VELOCITY)
  218.             {
  219.                 log("--- Velocity ---\n");
  220.                 log("- x = ");log(entity->get<Velocity>()->_x);log("\n");
  221.                 log("- y = ");log(entity->get<Velocity>()->_y);log("\n");
  222.                 log("- z = ");log(entity->get<Velocity>()->_z);log("\n");
  223.             }
  224.         }
  225.         it++;
  226.     }
  227. }
  228.  
  229. int main()
  230. {
  231.  
  232. // Init
  233.  
  234.     //Entity *player = new Entity(nullptr, "Mugen");
  235.  
  236.     Entity *player = createPlayer(nullptr, "Mugen");
  237.  
  238.     player->setRender([&](Entity *entity)
  239.     {
  240.         log("---------------------\n");
  241.         log("||- I am a PLAYER -||\n");
  242.         log("---------------------\n");
  243.     });
  244.  
  245.     player->add(new Position(10,20,30));
  246.     player->add(new Velocity(1,2,3));
  247.  
  248.     player->get<Position>()->_x = 99;
  249.     player->get<Position>()->_y = 88;
  250.  
  251.     player->get<Velocity>()->_z = 888888;
  252.  
  253.  
  254.     Entity *monster0 = new Entity(nullptr, "Monster");
  255.  
  256.     monster0->setRender(showMe);
  257.  
  258.     monster0->add(new Position());
  259.     monster0->add(new Velocity(77,55,33));
  260.  
  261.     monster0->get<Velocity>()->_x = -666;
  262.     monster0->get<Velocity>()->_y = -666;
  263.     monster0->get<Position>()->_z = 454545;
  264.  
  265.     //Entity *copyPlayer = new Entity(nullptr, "MugenCopy");
  266.     Entity *copyPlayer = Entity::cloneOf(player);
  267.  
  268.     Entity *monster1 = Entity::cloneOf(monster0, "Monster1");
  269.     Entity *monster2 = Entity::cloneOf(monster0);
  270.  
  271.     monster1->get<Position>()->_z = 11111111;
  272.     monster1->get<Velocity>()->_z = 11111111;
  273.  
  274.     monster2->get<Position>()->_x = 22222222;
  275.     monster2->get<Position>()->_y = 22222222;
  276.     monster2->get<Position>()->_z = 22222222;
  277.  
  278.     Entity *monster3 = Entity::cloneOf(monster1,"Monster3 : Clone of Monster1");
  279.  
  280.  
  281.     player->setRender(showMe);
  282.  
  283.     player->del(POSITION);
  284.  
  285.     monster2->del(POSITION);
  286.     monster2->del(VELOCITY);
  287.  
  288.  
  289. // Render
  290.  
  291.     player->render();
  292.     copyPlayer->render();
  293.  
  294.     monster0->render();
  295.     monster1->render();
  296.     monster2->render();
  297.  
  298.     monster3->render();
  299.  
  300.  
  301. // done
  302.  
  303.     delete player;
  304.     delete copyPlayer;
  305.  
  306.     delete monster0;
  307.     delete monster1;
  308.     delete monster2;
  309.  
  310.     delete monster3;
  311.  
  312.     return log("--- --- End of main OK --- ---\n");
  313. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement