From ebd54f08332933a55ed2ebb9e90f2b6cf9407f12 Mon Sep 17 00:00:00 2001 From: sippeangelo Date: Thu, 13 Mar 2014 21:40:12 +0100 Subject: [PATCH] Delayed removal of entities. --- Escape-the-Dawn/World.cpp | 38 ++++++++++++++++++++++++-------------- Escape-the-Dawn/World.h | 4 ++++ 2 files changed, 28 insertions(+), 14 deletions(-) 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