diff --git a/api/src/main/java/com/bartlomiejpluta/base/api/game/animation/Animation.java b/api/src/main/java/com/bartlomiejpluta/base/api/game/animation/Animation.java index 879fcdfe..63c948cb 100644 --- a/api/src/main/java/com/bartlomiejpluta/base/api/game/animation/Animation.java +++ b/api/src/main/java/com/bartlomiejpluta/base/api/game/animation/Animation.java @@ -1,14 +1,12 @@ package com.bartlomiejpluta.base.api.game.animation; -import com.bartlomiejpluta.base.api.game.entity.Direction; -import com.bartlomiejpluta.base.api.game.entity.Movement; -import com.bartlomiejpluta.base.api.game.map.layer.object.ObjectLayer; import com.bartlomiejpluta.base.api.internal.logic.Updatable; import com.bartlomiejpluta.base.api.internal.object.Placeable; import com.bartlomiejpluta.base.api.internal.render.Renderable; import org.joml.Vector2ic; public interface Animation extends Placeable, Renderable, Updatable { + void setStepSize(float x, float y); Vector2ic getCoordinates(); @@ -17,17 +15,11 @@ public interface Animation extends Placeable, Renderable, Updatable { void setCoordinates(int x, int y); - Movement prepareMovement(Direction direction); - - Movement getMovement(); - - void setSpeed(float speed); - void setAnimationSpeed(float speed); - boolean isMoving(); + Integer getRepeat(); - void onAdd(ObjectLayer layer); + void setRepeat(Integer repeat); - void onRemove(ObjectLayer layer); + boolean finished(); } diff --git a/api/src/main/java/com/bartlomiejpluta/base/api/game/context/Context.java b/api/src/main/java/com/bartlomiejpluta/base/api/game/context/Context.java index 1eb90a33..e1514d61 100644 --- a/api/src/main/java/com/bartlomiejpluta/base/api/game/context/Context.java +++ b/api/src/main/java/com/bartlomiejpluta/base/api/game/context/Context.java @@ -1,5 +1,6 @@ package com.bartlomiejpluta.base.api.game.context; +import com.bartlomiejpluta.base.api.game.animation.Animation; import com.bartlomiejpluta.base.api.game.camera.Camera; import com.bartlomiejpluta.base.api.game.entity.Entity; import com.bartlomiejpluta.base.api.game.gui.base.GUI; @@ -28,6 +29,8 @@ public interface Context extends Updatable, Renderable, Disposable { Entity createEntity(String entitySetUid); + Animation createAnimation(String animationUid); + Image getImage(String imageUid); GUI newGUI(); diff --git a/api/src/main/java/com/bartlomiejpluta/base/api/game/map/layer/base/Layer.java b/api/src/main/java/com/bartlomiejpluta/base/api/game/map/layer/base/Layer.java index 0206fc13..3412d777 100644 --- a/api/src/main/java/com/bartlomiejpluta/base/api/game/map/layer/base/Layer.java +++ b/api/src/main/java/com/bartlomiejpluta/base/api/game/map/layer/base/Layer.java @@ -1,9 +1,12 @@ package com.bartlomiejpluta.base.api.game.map.layer.base; +import com.bartlomiejpluta.base.api.game.animation.Animation; import com.bartlomiejpluta.base.api.game.map.model.GameMap; import com.bartlomiejpluta.base.api.internal.logic.Updatable; import com.bartlomiejpluta.base.api.internal.render.Renderable; public interface Layer extends Renderable, Updatable { GameMap getMap(); + + void pushAnimation(Animation animation); } diff --git a/api/src/main/java/com/bartlomiejpluta/base/api/game/map/model/GameMap.java b/api/src/main/java/com/bartlomiejpluta/base/api/game/map/model/GameMap.java index efdf542b..1047ef08 100644 --- a/api/src/main/java/com/bartlomiejpluta/base/api/game/map/model/GameMap.java +++ b/api/src/main/java/com/bartlomiejpluta/base/api/game/map/model/GameMap.java @@ -17,6 +17,8 @@ public interface GameMap { Vector2fc getSize(); + Vector2fc getStepSize(); + TileLayer getTileLayer(int layerIndex); ImageLayer getImageLayer(int layerIndex); diff --git a/engine/src/main/java/com/bartlomiejpluta/base/engine/context/manager/DefaultContextManager.java b/engine/src/main/java/com/bartlomiejpluta/base/engine/context/manager/DefaultContextManager.java index c5206d08..d8528ad5 100644 --- a/engine/src/main/java/com/bartlomiejpluta/base/engine/context/manager/DefaultContextManager.java +++ b/engine/src/main/java/com/bartlomiejpluta/base/engine/context/manager/DefaultContextManager.java @@ -64,6 +64,7 @@ public class DefaultContextManager implements ContextManager { return DefaultContext.builder() .engine(engine) .entityManager(entityManager) + .animationManager(animationManager) .imageManager(imageManager) .mapManager(mapManager) .fontManager(fontManager) diff --git a/engine/src/main/java/com/bartlomiejpluta/base/engine/context/model/DefaultContext.java b/engine/src/main/java/com/bartlomiejpluta/base/engine/context/model/DefaultContext.java index 962b191d..c12e35fc 100644 --- a/engine/src/main/java/com/bartlomiejpluta/base/engine/context/model/DefaultContext.java +++ b/engine/src/main/java/com/bartlomiejpluta/base/engine/context/model/DefaultContext.java @@ -1,5 +1,6 @@ package com.bartlomiejpluta.base.engine.context.model; +import com.bartlomiejpluta.base.api.game.animation.Animation; import com.bartlomiejpluta.base.api.game.camera.Camera; import com.bartlomiejpluta.base.api.game.context.Context; import com.bartlomiejpluta.base.api.game.entity.Entity; @@ -15,6 +16,7 @@ import com.bartlomiejpluta.base.engine.gui.manager.FontManager; import com.bartlomiejpluta.base.engine.gui.manager.WidgetDefinitionManager; import com.bartlomiejpluta.base.engine.gui.render.NanoVGGUI; import com.bartlomiejpluta.base.engine.gui.xml.inflater.Inflater; +import com.bartlomiejpluta.base.engine.world.animation.manager.AnimationManager; import com.bartlomiejpluta.base.engine.world.entity.manager.EntityManager; import com.bartlomiejpluta.base.engine.world.image.manager.ImageManager; import com.bartlomiejpluta.base.engine.world.map.manager.MapManager; @@ -38,6 +40,9 @@ public class DefaultContext implements Context { @NonNull private final EntityManager entityManager; + @NonNull + private final AnimationManager animationManager; + @NonNull private final ImageManager imageManager; @@ -108,6 +113,11 @@ public class DefaultContext implements Context { return entityManager.createEntity(entitySetUid); } + @Override + public Animation createAnimation(String animationUid) { + return animationManager.loadObject(animationUid); + } + @Override public Image getImage(@NonNull String imageUid) { return imageManager.loadObject(imageUid); diff --git a/engine/src/main/java/com/bartlomiejpluta/base/engine/world/animation/manager/DefaultAnimationManager.java b/engine/src/main/java/com/bartlomiejpluta/base/engine/world/animation/manager/DefaultAnimationManager.java index 9ce2fa32..3d9c5466 100644 --- a/engine/src/main/java/com/bartlomiejpluta/base/engine/world/animation/manager/DefaultAnimationManager.java +++ b/engine/src/main/java/com/bartlomiejpluta/base/engine/world/animation/manager/DefaultAnimationManager.java @@ -57,6 +57,8 @@ public class DefaultAnimationManager implements AnimationManager { } private Vector2fc[] createFrames(int rows, int columns) { + log.info("Caching [{}x{}] animation ([{}] frames)", columns, rows, columns * rows); + var frames = new Vector2fc[rows * columns]; for (int row = 0; row < rows; ++row) { diff --git a/engine/src/main/java/com/bartlomiejpluta/base/engine/world/animation/model/AnimatedSprite.java b/engine/src/main/java/com/bartlomiejpluta/base/engine/world/animation/model/AnimatedSprite.java index bdf14b90..0cf4b5dd 100644 --- a/engine/src/main/java/com/bartlomiejpluta/base/engine/world/animation/model/AnimatedSprite.java +++ b/engine/src/main/java/com/bartlomiejpluta/base/engine/world/animation/model/AnimatedSprite.java @@ -13,6 +13,7 @@ import org.joml.Vector2fc; @EqualsAndHashCode(callSuper = true) public abstract class AnimatedSprite extends Sprite implements Updatable { private int time; + protected int currentAnimationFrame; public AnimatedSprite(Mesh mesh, Material material) { super(mesh, material); @@ -40,8 +41,8 @@ public abstract class AnimatedSprite extends Sprite implements Updatable { if (shouldAnimate()) { var positions = getSpriteAnimationFramesPositions(); var delay = getAnimationSpeed(); - var currentPosition = ((time % (positions.length * delay)) / delay); - var current = positions[currentPosition]; + currentAnimationFrame = ((time % (positions.length * delay)) / delay); + var current = positions[currentAnimationFrame]; material.setSpritePosition(current); } } diff --git a/engine/src/main/java/com/bartlomiejpluta/base/engine/world/animation/model/DefaultAnimation.java b/engine/src/main/java/com/bartlomiejpluta/base/engine/world/animation/model/DefaultAnimation.java index a0b8adf1..64762053 100644 --- a/engine/src/main/java/com/bartlomiejpluta/base/engine/world/animation/model/DefaultAnimation.java +++ b/engine/src/main/java/com/bartlomiejpluta/base/engine/world/animation/model/DefaultAnimation.java @@ -1,26 +1,31 @@ package com.bartlomiejpluta.base.engine.world.animation.model; import com.bartlomiejpluta.base.api.game.animation.Animation; -import com.bartlomiejpluta.base.api.game.map.layer.object.ObjectLayer; import com.bartlomiejpluta.base.api.util.math.MathUtil; import com.bartlomiejpluta.base.engine.core.gl.object.material.Material; import com.bartlomiejpluta.base.engine.core.gl.object.mesh.Mesh; import com.bartlomiejpluta.base.engine.world.movement.MovableSprite; +import lombok.Getter; import lombok.NonNull; +import lombok.Setter; import org.joml.Vector2fc; public class DefaultAnimation extends MovableSprite implements Animation { private final Vector2fc[] frames; + private final int lastFrameIndex; + private int animationSpeed = 100; + private int iteration = 0; + private boolean updated = false; + + @Getter + @Setter + private Integer repeat = 1; public DefaultAnimation(Mesh mesh, Material material, @NonNull Vector2fc[] frames) { super(mesh, material); this.frames = frames; - } - - @Override - public void setSpeed(float speed) { - framesToCrossOneTile = (int) (1 / MathUtil.clamp(speed, Float.MIN_VALUE, 1.0)); + this.lastFrameIndex = frames.length - 1; } @Override @@ -28,16 +33,6 @@ public class DefaultAnimation extends MovableSprite implements Animation { animationSpeed = (int) (1 / MathUtil.clamp(speed, Float.MIN_VALUE, 1.0)); } - @Override - public void onAdd(ObjectLayer layer) { - // do nothing - } - - @Override - public void onRemove(ObjectLayer layer) { - // do nothing - } - @Override public int getAnimationSpeed() { return animationSpeed; @@ -57,4 +52,22 @@ public class DefaultAnimation extends MovableSprite implements Animation { protected void setDefaultAnimationFrame() { // do nothing } + + @Override + public boolean finished() { + if (repeat == null) { + return false; + } + + if (currentAnimationFrame == 0) { + updated = false; + } + + if (currentAnimationFrame == lastFrameIndex && !updated) { + ++iteration; + updated = true; + } + + return iteration >= repeat; + } } 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 new file mode 100644 index 00000000..1e61ebf4 --- /dev/null +++ b/engine/src/main/java/com/bartlomiejpluta/base/engine/world/map/layer/base/BaseLayer.java @@ -0,0 +1,60 @@ +package com.bartlomiejpluta.base.engine.world.map.layer.base; + +import com.bartlomiejpluta.base.api.game.animation.Animation; +import com.bartlomiejpluta.base.api.game.camera.Camera; +import com.bartlomiejpluta.base.api.game.map.layer.base.Layer; +import com.bartlomiejpluta.base.api.game.map.model.GameMap; +import com.bartlomiejpluta.base.api.game.screen.Screen; +import com.bartlomiejpluta.base.api.internal.logic.Updatable; +import com.bartlomiejpluta.base.api.internal.render.ShaderManager; +import lombok.NonNull; +import org.joml.Vector2fc; + +import java.util.LinkedList; +import java.util.Queue; + +public abstract class BaseLayer implements Layer, Updatable { + + @NonNull + protected final GameMap map; + + @NonNull + protected final Vector2fc stepSize; + + private final Queue animations = new LinkedList<>(); + + public BaseLayer(@NonNull GameMap map) { + this.map = map; + this.stepSize = map.getStepSize(); + } + + @Override + public void pushAnimation(Animation animation) { + animations.add(animation); + animation.setStepSize(stepSize.x(), stepSize.y()); + } + + @Override + public GameMap getMap() { + return map; + } + + @Override + public void update(float dt) { + for (var iterator = animations.iterator(); iterator.hasNext(); ) { + var animation = iterator.next(); + animation.update(dt); + + if (animation.finished()) { + iterator.remove(); + } + } + } + + @Override + public void render(Screen screen, Camera camera, ShaderManager shaderManager) { + for (var animation : animations) { + animation.render(screen, camera, shaderManager); + } + } +} diff --git a/engine/src/main/java/com/bartlomiejpluta/base/engine/world/map/layer/color/DefaultColorLayer.java b/engine/src/main/java/com/bartlomiejpluta/base/engine/world/map/layer/color/DefaultColorLayer.java index d11f0c91..7a507c3d 100644 --- a/engine/src/main/java/com/bartlomiejpluta/base/engine/world/map/layer/color/DefaultColorLayer.java +++ b/engine/src/main/java/com/bartlomiejpluta/base/engine/world/map/layer/color/DefaultColorLayer.java @@ -1,21 +1,28 @@ package com.bartlomiejpluta.base.engine.world.map.layer.color; +import com.bartlomiejpluta.base.api.game.camera.Camera; import com.bartlomiejpluta.base.api.game.map.layer.color.ColorLayer; import com.bartlomiejpluta.base.api.game.map.model.GameMap; +import com.bartlomiejpluta.base.api.game.screen.Screen; +import com.bartlomiejpluta.base.api.internal.object.Placeable; +import com.bartlomiejpluta.base.api.internal.render.ShaderManager; import com.bartlomiejpluta.base.engine.core.gl.object.material.Material; import com.bartlomiejpluta.base.engine.util.mesh.MeshManager; +import com.bartlomiejpluta.base.engine.world.map.layer.base.BaseLayer; import com.bartlomiejpluta.base.engine.world.object.Sprite; -import lombok.Getter; import lombok.NonNull; +import org.joml.Matrix4fc; +import org.joml.Vector2fc; -public class DefaultColorLayer extends Sprite implements ColorLayer { - - @Getter - private final GameMap map; +public class DefaultColorLayer extends BaseLayer implements ColorLayer { + private final Color color; + private final Material material; public DefaultColorLayer(@NonNull GameMap map, @NonNull MeshManager meshManager, float red, float green, float blue, float alpha) { - super(meshManager.createQuad(1, 1, 0, 0), Material.colored(red, green, blue, alpha)); - this.map = map; + super(map); + this.color = new Color(meshManager, red, green, blue, alpha); + this.material = color.getMaterial(); + setScale(map.getWidth(), map.getHeight()); } @@ -50,7 +57,94 @@ public class DefaultColorLayer extends Sprite implements ColorLayer { } @Override - public void update(float dt) { - // Do nothing + public Vector2fc getPosition() { + return color.getPosition(); + } + + @Override + public void setPosition(float x, float y) { + color.setPosition(x, y); + } + + @Override + public void setPosition(Vector2fc position) { + color.setPosition(position); + } + + @Override + public void movePosition(float x, float y) { + color.movePosition(x, y); + } + + @Override + public void movePosition(Vector2fc position) { + color.movePosition(position); + } + + @Override + public float getRotation() { + return color.getRotation(); + } + + @Override + public void setRotation(float rotation) { + color.setRotation(rotation); + } + + @Override + public void moveRotation(float rotation) { + color.moveRotation(rotation); + } + + @Override + public float getScaleX() { + return color.getScaleX(); + } + + @Override + public void setScaleX(float scale) { + color.setScaleX(scale); + } + + @Override + public float getScaleY() { + return color.getScaleY(); + } + + @Override + public void setScaleY(float scale) { + color.setScaleY(scale); + } + + @Override + public void setScale(float scale) { + color.setScale(scale); + } + + @Override + public void setScale(float scaleX, float scaleY) { + color.setScale(scaleX, scaleY); + } + + @Override + public float euclideanDistance(Placeable other) { + return color.euclideanDistance(other); + } + + @Override + public Matrix4fc getModelMatrix() { + return color.getModelMatrix(); + } + + @Override + public void render(Screen screen, Camera camera, ShaderManager shaderManager) { + color.render(screen, camera, shaderManager); + super.render(screen, camera, shaderManager); + } + + private static class Color extends Sprite { + public Color(@NonNull MeshManager meshManager, float red, float green, float blue, float alpha) { + super(meshManager.createQuad(1, 1, 0, 0), Material.colored(red, green, blue, alpha)); + } } } diff --git a/engine/src/main/java/com/bartlomiejpluta/base/engine/world/map/layer/image/DefaultImageLayer.java b/engine/src/main/java/com/bartlomiejpluta/base/engine/world/map/layer/image/DefaultImageLayer.java index ff106682..f4874caa 100644 --- a/engine/src/main/java/com/bartlomiejpluta/base/engine/world/map/layer/image/DefaultImageLayer.java +++ b/engine/src/main/java/com/bartlomiejpluta/base/engine/world/map/layer/image/DefaultImageLayer.java @@ -7,17 +7,15 @@ import com.bartlomiejpluta.base.api.game.map.layer.image.ImageLayerMode; import com.bartlomiejpluta.base.api.game.map.model.GameMap; import com.bartlomiejpluta.base.api.game.screen.Screen; import com.bartlomiejpluta.base.api.internal.render.ShaderManager; +import com.bartlomiejpluta.base.engine.world.map.layer.base.BaseLayer; import lombok.Getter; import lombok.NonNull; import lombok.Setter; -public class DefaultImageLayer implements ImageLayer { +public class DefaultImageLayer extends BaseLayer implements ImageLayer { private final float mapWidth; private final float mapHeight; - @Getter - private final GameMap map; - @NonNull @Getter private Image image; @@ -40,7 +38,7 @@ public class DefaultImageLayer implements ImageLayer { private boolean parallax; public DefaultImageLayer(GameMap map, Image image, float opacity, float x, float y, float scaleX, float scaleY, ImageLayerMode mode, boolean parallax) { - this.map = map; + super(map); this.mapWidth = map.getWidth(); this.mapHeight = map.getHeight(); @@ -108,11 +106,6 @@ public class DefaultImageLayer implements ImageLayer { recalculate(); } - @Override - public void update(float dt) { - // Do nothing - } - @Override public void render(Screen screen, Camera camera, ShaderManager shaderManager) { if (image != null) { @@ -127,5 +120,7 @@ public class DefaultImageLayer implements ImageLayer { image.render(screen, camera, shaderManager); } + + super.render(screen, camera, shaderManager); } } 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 a128240b..622ddbd4 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 @@ -10,9 +10,9 @@ import com.bartlomiejpluta.base.api.game.map.model.GameMap; import com.bartlomiejpluta.base.api.game.rule.Rule; import com.bartlomiejpluta.base.api.game.screen.Screen; import com.bartlomiejpluta.base.api.internal.render.ShaderManager; +import com.bartlomiejpluta.base.engine.world.map.layer.base.BaseLayer; import lombok.Getter; import lombok.NonNull; -import org.joml.Vector2fc; import org.joml.Vector2ic; import java.util.ArrayList; @@ -20,10 +20,7 @@ import java.util.LinkedList; import java.util.List; import java.util.Queue; -public class DefaultObjectLayer implements ObjectLayer { - - @Getter - private final GameMap map; +public class DefaultObjectLayer extends BaseLayer implements ObjectLayer { @Getter private final List entities; @@ -40,13 +37,11 @@ public class DefaultObjectLayer implements ObjectLayer { private final int rows; private final int columns; - private final Vector2fc stepSize; - public DefaultObjectLayer(@NonNull GameMap map, int rows, int columns, @NonNull Vector2fc stepSize, List entities, PassageAbility[][] passageMap) { - this.map = map; + public DefaultObjectLayer(@NonNull GameMap map, int rows, int columns, List entities, PassageAbility[][] passageMap) { + super(map); this.rows = rows; this.columns = columns; - this.stepSize = stepSize; this.entities = entities; this.passageMap = passageMap; } @@ -126,6 +121,8 @@ public class DefaultObjectLayer implements ObjectLayer { @Override public void update(float dt) { + super.update(dt); + while (!movements.isEmpty()) { var movement = movements.poll(); if (isTileReachable(movement.getTo())) { @@ -171,6 +168,8 @@ public class DefaultObjectLayer implements ObjectLayer { for (var object : entities) { object.render(screen, camera, shaderManager); } + + super.render(screen, camera, shaderManager); } private int compareObjects(Entity a, Entity b) { diff --git a/engine/src/main/java/com/bartlomiejpluta/base/engine/world/map/layer/tile/DefaultTileLayer.java b/engine/src/main/java/com/bartlomiejpluta/base/engine/world/map/layer/tile/DefaultTileLayer.java index 4efe4c3c..ea0131c4 100644 --- a/engine/src/main/java/com/bartlomiejpluta/base/engine/world/map/layer/tile/DefaultTileLayer.java +++ b/engine/src/main/java/com/bartlomiejpluta/base/engine/world/map/layer/tile/DefaultTileLayer.java @@ -5,22 +5,19 @@ import com.bartlomiejpluta.base.api.game.map.layer.tile.TileLayer; import com.bartlomiejpluta.base.api.game.map.model.GameMap; import com.bartlomiejpluta.base.api.game.screen.Screen; import com.bartlomiejpluta.base.api.internal.render.ShaderManager; +import com.bartlomiejpluta.base.engine.world.map.layer.base.BaseLayer; import com.bartlomiejpluta.base.engine.world.tileset.model.Tile; import com.bartlomiejpluta.base.engine.world.tileset.model.TileSet; -import lombok.Getter; import lombok.NonNull; import java.util.Arrays; -public class DefaultTileLayer implements TileLayer { +public class DefaultTileLayer extends BaseLayer implements TileLayer { private final TileSet tileSet; private final Tile[][] layer; - @Getter - private final GameMap map; - public DefaultTileLayer(@NonNull GameMap map, @NonNull TileSet tileSet, int rows, int columns) { - this.map = map; + super(map); this.tileSet = tileSet; layer = new Tile[rows][columns]; Arrays.stream(layer).forEach(tiles -> Arrays.fill(tiles, null)); @@ -46,11 +43,6 @@ public class DefaultTileLayer implements TileLayer { layer[row][column] = null; } - @Override - public void update(float dt) { - // Do nothing - } - @Override public void render(Screen screen, Camera camera, ShaderManager shaderManager) { for (var row : layer) { @@ -60,5 +52,7 @@ public class DefaultTileLayer implements TileLayer { } } } + + super.render(screen, camera, shaderManager); } } diff --git a/engine/src/main/java/com/bartlomiejpluta/base/engine/world/map/model/DefaultGameMap.java b/engine/src/main/java/com/bartlomiejpluta/base/engine/world/map/model/DefaultGameMap.java index b482d175..425648a3 100644 --- a/engine/src/main/java/com/bartlomiejpluta/base/engine/world/map/model/DefaultGameMap.java +++ b/engine/src/main/java/com/bartlomiejpluta/base/engine/world/map/model/DefaultGameMap.java @@ -130,7 +130,7 @@ public class DefaultGameMap implements Renderable, Updatable, GameMap { Arrays.fill(passageMap[i], 0, columns, PassageAbility.ALLOW); } - var layer = new DefaultObjectLayer(this, rows, columns, stepSize, new ArrayList<>(), passageMap); + var layer = new DefaultObjectLayer(this, rows, columns, new ArrayList<>(), passageMap); layers.add(layer);