#include "EntityManagement.h" EntityManagement::EntityManagement() : mapOfEntities(), entityID(0), entityMessageSystemEvent() { entityMessageSystemEvent.reserve(MAX_NO_OF_ENTITIES); // Constructor - Initialize all Eninge Messages for (auto i = 0; i < static_cast<int>(MessageSystemEventType::END_TYPE); ++i) { mapOfEntities.emplace(i, messageSystemEventVector()); } } // Destructor EntityManagement::~EntityManagement() { auto unorderedSet = std::unordered_set<uint32_t>(); for (auto EventType : mapOfEntities) { for (auto it = EventType.second.begin(); it != EventType.second.end(); ++it) { delete it->first; if (unorderedSet.find(it->second->getEntityID()) != unorderedSet.end()) { unorderedSet.insert(it->second->getEntityID()); delete it->second; } } } } // Create Entity at default position Entity* EntityManagement::createEntity(std::string inputTextureID, sf::IntRect inputEntityRectangle) { auto spriteRectangle = new SpriteRectangle(inputTextureID, inputEntityRectangle); return createEntity(spriteRectangle); } // Create Entity at default position Entity* EntityManagement::createEntity(SpriteRectangle* inputSpriteRectangle) { auto entity = new Entity(getNextEntityID(), *this, *inputSpriteRectangle); std::cout << "Creating Entity Nr: " << entity->getEntityID() << std::endl; mapOfEntities.find(static_cast<int>(MessageSystemEventType::SPRITE_RECTANGLE_TYPE))->second.push_back(std::make_pair(inputSpriteRectangle, entity)); entityMessageSystemEvent.emplace(entity->getEntityID(), std::vector<MessageSystemEvent*>{inputSpriteRectangle}); return entity; } // Destroy Entity void EntityManagement::destroyEntity(Entity* inputEntity) { inputEntity->isDeleted = true; for (auto engineEventType : mapOfEntities) { std::pair<MessageSystemEvent*, Entity*>* matches[MAX_NR_OF_ENGINE_EventS]; for (auto e : matches) { delete e->first; engineEventType.second.clear(); // } } entityMessageSystemEvent.erase(inputEntity->getEntityID()); std::cout << "Destroyed Entity Nr: " << inputEntity->getEntityID() << std::endl; delete inputEntity; } // Add Message to Entity void EntityManagement::addMessageSystemEvent(Entity& inputEntity, MessageSystemEvent& inputMessageSystemEvent) { std::cout << "Adding Message System Event type: " << inputMessageSystemEvent.getTypeValue() << " to Entity: " << inputEntity.getEntityID() << std::endl; mapOfEntities.find(inputMessageSystemEvent.getTypeValue())->second.push_back(std::make_pair(&inputMessageSystemEvent, &inputEntity)); entityMessageSystemEvent.find(inputEntity.getEntityID())->second.push_back(&inputMessageSystemEvent); } // Remove Message from Entity void EntityManagement::removeMessageSystemEvent(Entity& inputEntity, MessageSystemEvent& inputMessageSystemEvent) { auto entityMap = mapOfEntities.find(inputMessageSystemEvent.getTypeValue())->second; auto iterator = std::find_if(entityMap.begin(), entityMap.end(), [&inputEntity, &inputMessageSystemEvent](std::pair<MessageSystemEvent*, Entity*> entityMessageSystemEvent) { return (inputEntity == *(entityMessageSystemEvent.second)) && (&inputMessageSystemEvent == entityMessageSystemEvent.first); }); if (iterator != entityMap.end()) { std::cout << "Deleting Message System " << typeid(iterator->first).name() << " Event type from Entity: " << iterator->second->getEntityID() << std::endl; delete iterator->first; entityMap.erase(iterator); } else { throw "No such Message System Event in Entity"; } auto messageSystemEvent = entityMessageSystemEvent.find(inputEntity.getEntityID())->second; auto messageSystemEventIterator = std::find_if(messageSystemEvent.begin(), messageSystemEvent.end(), [&inputMessageSystemEvent](MessageSystemEvent* p) { return (&inputMessageSystemEvent == p); }); messageSystemEvent.erase(messageSystemEventIterator); } // Get Message System Event std::vector<MessageSystemEvent*>* EntityManagement::getMessageSystemEventType(uint32_t inputMessageSystemID) { return &entityMessageSystemEvent.find(inputMessageSystemID)->second; } // Get Message System Event messageSystemEventVector* EntityManagement::getMessageSystemEventType(MessageSystemEventType inputMessageSystemType) { return &(mapOfEntities.find(static_cast<int>(inputMessageSystemType))->second); } // Get Max Entity ID uint32_t EntityManagement::getMaxEntityID() const { return entityID; } // Get Next Entity ID uint32_t EntityManagement::getNextEntityID() { return entityID++; }