From 4f4e1bec7b05de145be9ebca995faa65389034c0 Mon Sep 17 00:00:00 2001 From: Brychan Dempsey Date: Thu, 10 Jun 2021 22:45:12 +1200 Subject: [PATCH] Improved entity destruction handling --- .../nz/ac/massey/javaecs/ComponentManager.java | 16 +++++++++++++--- .../main/java/nz/ac/massey/javaecs/Engine.java | 2 +- .../main/java/nz/ac/massey/javaecs/Entity.java | 8 +++++++- .../java/nz/ac/massey/javaecs/SystemManager.java | 1 + 4 files changed, 22 insertions(+), 5 deletions(-) diff --git a/javaecs/src/main/java/nz/ac/massey/javaecs/ComponentManager.java b/javaecs/src/main/java/nz/ac/massey/javaecs/ComponentManager.java index 961118d..4c6bd98 100644 --- a/javaecs/src/main/java/nz/ac/massey/javaecs/ComponentManager.java +++ b/javaecs/src/main/java/nz/ac/massey/javaecs/ComponentManager.java @@ -39,10 +39,20 @@ class ComponentManager{ * Signals to the ComponentManager the entity was destroyed. All component data references should be removed. * @param entity the entity that was destroyed. */ - public void entityDestroyed(Entity entity){ - for (Type key : componentArrays.keySet()) { - componentArrays.get(key).removeData(entity); + public void entityDestroyed(Entity entity, BitSet entityRegistrations){ + // HashMap lookups take time, use the known bitstates + int index = entityRegistrations.nextSetBit(0); + while(index != -1){ + if (!componentArrays.get(indexComponentType.get(index)).removeData(entity)){ + Engine.writeErr(indexComponentType.get(index).getTypeName()); + } + index = entityRegistrations.nextSetBit(index+1); } + /*for (Type key : componentArrays.keySet()) { + if (!componentArrays.get(key).removeData(entity)){ + Engine.writeErr(key.getTypeName()); + } + }*/ } /** diff --git a/javaecs/src/main/java/nz/ac/massey/javaecs/Engine.java b/javaecs/src/main/java/nz/ac/massey/javaecs/Engine.java index 1bdeabf..1c11b0b 100644 --- a/javaecs/src/main/java/nz/ac/massey/javaecs/Engine.java +++ b/javaecs/src/main/java/nz/ac/massey/javaecs/Engine.java @@ -76,8 +76,8 @@ public class Engine { * @param entity the entity to destroy */ public void destroyEntity(Entity entity){ + componentManager.entityDestroyed(entity, entityManager.getRegistrations(entity)); entityManager.removeEntity(entity); - componentManager.entityDestroyed(entity); systemManager.entityDestroyed(entity); } diff --git a/javaecs/src/main/java/nz/ac/massey/javaecs/Entity.java b/javaecs/src/main/java/nz/ac/massey/javaecs/Entity.java index a311cca..1073a51 100644 --- a/javaecs/src/main/java/nz/ac/massey/javaecs/Entity.java +++ b/javaecs/src/main/java/nz/ac/massey/javaecs/Entity.java @@ -33,7 +33,13 @@ public class Entity { @Override public boolean equals(Object obj) { - return (this.getValue() == ((Entity)obj).getValue()); + if (obj instanceof Entity){ + return (this.getValue() == ((Entity)obj).getValue()); + } + else if (obj instanceof Integer){ + return (this.value == (Integer)obj); + } + else return false; } @Override diff --git a/javaecs/src/main/java/nz/ac/massey/javaecs/SystemManager.java b/javaecs/src/main/java/nz/ac/massey/javaecs/SystemManager.java index cf5df38..7b919ba 100644 --- a/javaecs/src/main/java/nz/ac/massey/javaecs/SystemManager.java +++ b/javaecs/src/main/java/nz/ac/massey/javaecs/SystemManager.java @@ -24,6 +24,7 @@ class SystemManager{ * @param entity the destroyed entity */ protected void entityDestroyed(Entity entity){ + // Unlike components, this isn't simply indexed; makes more sense just to search the systems for (Type key : systems.keySet()) { systems.get(key).entities.remove(entity); }