Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #pragma once
- #include <vector>
- #include <string>
- #include "Components.h"
- #define MAX_ENTITIES 1024
- template <typename ComponentType>
- struct ComponentList
- {
- std::vector<ComponentType> List;
- std::vector<int> Unused;
- std::vector<int> Map;
- COMP_MASKS Mask;
- int Count;
- ComponentList()
- {
- for (int i = 0; i < MAX_ENTITIES; i++)
- Map.push_back(0);
- }
- };
- class ECS
- {
- public:
- ECS();
- ~ECS();
- //-- Entity Handling Methods --//
- int EntityCreate();
- void EntityDestroy(int EntityId);
- //-- Component handling methods --//
- template <typename CompType>
- CompType* EntityAddComponent(int EntityId, ComponentList<CompType> &Component);
- template <typename CompType>
- void EntityRemoveComponent(int EntityId, ComponentList<CompType> &Component);
- template <typename CompType>
- bool EntityHasComponent(int EntityId, ComponentList<CompType> Component);
- //-- Entity Masks --//
- std::vector<int64_t> Entities;
- std::vector<int> FreeEntitiesList;
- int EntitiesCount;
- //-- List of Component Lists --//
- std::vector<ComponentList<CompGeneric>*> ComponentLists;
- //-- Component Lists --//
- ComponentList<CompInfo> InfoComps; // Information Components
- ComponentList<CompPosition> PositionComps; // Position Components
- ComponentList<CompSpeed> SpeedComps; // Speed Components
- ComponentList<CompSprite> SpriteComps; // Sprite Components
- };
- //----------------------------------------------------
- //----- Attach a component to an entity --------------
- //----------------------------------------------------
- template <typename CompType>
- CompType* ECS::EntityAddComponent(int EntityId, ComponentList<CompType> &Component)
- {
- Entities[EntityId] |= Component.Mask;
- if (Component.Unused.size() == 0)
- {
- CompType newComponent;
- Component.Map[EntityId] = Component.Count;
- Component.Count++;
- Component.List.push_back(newComponent);
- return &Component.List.back(); // Return pointer to added component for editing.
- }
- else
- {
- Component.Map[EntityId] = Component.Unused[Component.Unused.back()];
- Component.Unused.pop_back();
- return &Component.List[Component.Map[EntityId]]; // Return pointer to added component for editing.
- }
- };
- //----------------------------------------------------
- //----- Remove a component from an entity ------------
- //----------------------------------------------------
- template <typename CompType>
- void ECS::EntityRemoveComponent(int EntityId, ComponentList<CompType> &Component)
- {
- Entities[EntityId] ^= Component.Mask;
- Component.Unused.push_back(Component.Map[EntityId]);
- };
- //----------------------------------------------------
- //----- Check if an entity has a component -----------
- //----------------------------------------------------
- template <typename CompType>
- bool ECS::EntityHasComponent(int EntityId, ComponentList<CompType> Component)
- {
- return ((Entities[EntityId] & Component.Mask) == Component.Mask);
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement