diff --git a/Escape-the-Dawn/World.cpp b/Escape-the-Dawn/World.cpp index 500395e..1e24e82 100644 --- a/Escape-the-Dawn/World.cpp +++ b/Escape-the-Dawn/World.cpp @@ -36,6 +36,8 @@ void World::Update(double dt) system->Update(dt); RecursiveUpdate(system, dt, 0); } + + ProcessEntityRemovals(); } //std::vector GetEntityChildren(EntityID entity); @@ -60,21 +62,29 @@ bool World::ValidEntity(EntityID entity) void World::RemoveEntity(EntityID entity) { - m_EntityParents.erase(entity); - // Remove components - for (auto pair : m_EntityComponents[entity]) { - auto type = pair.first; - auto component = pair.second; - // Trigger events - for (auto pair : m_Systems) { - auto system = pair.second; - system->OnComponentRemoved(type, component.get()); - } - m_ComponentsOfType[type].remove(component); - } - m_EntityComponents.erase(entity); + m_EntitiesToRemove.push_back(entity); +} - RecycleEntityID(entity); +void World::ProcessEntityRemovals() +{ + for (auto entity : m_EntitiesToRemove) { + m_EntityParents.erase(entity); + // Remove components + for (auto pair : m_EntityComponents[entity]) { + auto type = pair.first; + auto component = pair.second; + // Trigger events + for (auto pair : m_Systems) { + auto system = pair.second; + system->OnComponentRemoved(type, component.get()); + } + m_ComponentsOfType[type].remove(component); + } + m_EntityComponents.erase(entity); + + RecycleEntityID(entity); + } + m_EntitiesToRemove.clear(); } EntityID World::CreateEntity(EntityID parent /*= 0*/) diff --git a/Escape-the-Dawn/World.h b/Escape-the-Dawn/World.h index add6ae3..18a0fce 100644 --- a/Escape-the-Dawn/World.h +++ b/Escape-the-Dawn/World.h @@ -85,9 +85,13 @@ protected: std::unordered_map>> m_ComponentsOfType; std::unordered_map>> m_EntityComponents; + std::list m_EntitiesToRemove; + void ProcessEntityRemovals(); + EntityID GenerateEntityID(); void RecycleEntityID(EntityID id); + }; template