diff --git a/engine/src/main/java/com/bartlomiejpluta/base/engine/world/map/layer/base/BaseLayer.java b/engine/src/main/java/com/bartlomiejpluta/base/engine/world/map/layer/base/BaseLayer.java index 349e3cd7..be04033c 100644 --- a/engine/src/main/java/com/bartlomiejpluta/base/engine/world/map/layer/base/BaseLayer.java +++ b/engine/src/main/java/com/bartlomiejpluta/base/engine/world/map/layer/base/BaseLayer.java @@ -11,6 +11,7 @@ import lombok.NonNull; import org.joml.Vector2fc; import java.util.LinkedList; +import java.util.List; import java.util.Queue; public abstract class BaseLayer implements Layer, Updatable { @@ -23,6 +24,8 @@ public abstract class BaseLayer implements Layer, Updatable { protected final Queue animations = new LinkedList<>(); + private final List animationsToAdd = new LinkedList<>(); + public BaseLayer(@NonNull GameMap map) { this.map = map; this.stepSize = map.getStepSize(); @@ -30,9 +33,7 @@ public abstract class BaseLayer implements Layer, Updatable { @Override public void pushAnimation(Animation animation) { - animation.setStepSize(stepSize.x(), stepSize.y()); - animations.add(animation); - animation.onAdd(this); + animationsToAdd.add(animation); } @Override @@ -42,6 +43,16 @@ public abstract class BaseLayer implements Layer, Updatable { @Override public void update(float dt) { + if(!animationsToAdd.isEmpty()) { + for(var animation : animationsToAdd) { + animation.setStepSize(stepSize.x(), stepSize.y()); + animations.add(animation); + animation.onAdd(this); + } + + animationsToAdd.clear(); + } + for (var iterator = animations.iterator(); iterator.hasNext(); ) { var animation = iterator.next(); animation.update(dt); diff --git a/engine/src/main/java/com/bartlomiejpluta/base/engine/world/map/layer/object/DefaultObjectLayer.java b/engine/src/main/java/com/bartlomiejpluta/base/engine/world/map/layer/object/DefaultObjectLayer.java index 622ddbd4..d2a055d6 100644 --- a/engine/src/main/java/com/bartlomiejpluta/base/engine/world/map/layer/object/DefaultObjectLayer.java +++ b/engine/src/main/java/com/bartlomiejpluta/base/engine/world/map/layer/object/DefaultObjectLayer.java @@ -32,6 +32,8 @@ public class DefaultObjectLayer extends BaseLayer implements ObjectLayer { private final List rules = new ArrayList<>(); + private final List entitiesToAdd = new LinkedList<>(); + private final List rulesToAdd = new LinkedList<>(); private final List entitiesToRemove = new LinkedList<>(); private final List rulesToRemove = new LinkedList<>(); @@ -48,7 +50,7 @@ public class DefaultObjectLayer extends BaseLayer implements ObjectLayer { @Override public void registerRule(Rule rule) { - rules.add(rule); + rulesToAdd.add(rule); } @Override @@ -63,9 +65,7 @@ public class DefaultObjectLayer extends BaseLayer implements ObjectLayer { @Override public void addEntity(Entity entity) { - entity.onAdd(this); - entity.setStepSize(stepSize.x(), stepSize.y()); - entities.add(entity); + entitiesToAdd.add(entity); } @Override @@ -144,6 +144,23 @@ public class DefaultObjectLayer extends BaseLayer implements ObjectLayer { } } + // Insert entities requested to be added + if(!entitiesToAdd.isEmpty()) { + for (var entity : entitiesToAdd) { + entity.onAdd(this); + entity.setStepSize(stepSize.x(), stepSize.y()); + entities.add(entity); + } + + entitiesToAdd.clear(); + } + + // Insert rules requested to be added + if(!rulesToAdd.isEmpty()) { + rules.addAll(rulesToAdd); + rulesToAdd.clear(); + } + // Remove entities requested to be removed if (!entitiesToRemove.isEmpty()) { for (var entity : entitiesToRemove) {