Add basic support for Infinite and N-repeated animations

This commit is contained in:
2021-03-20 12:09:06 +01:00
parent 82d2bef569
commit a99ab3afb0
15 changed files with 239 additions and 70 deletions

View File

@@ -1,14 +1,12 @@
package com.bartlomiejpluta.base.api.game.animation; 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.logic.Updatable;
import com.bartlomiejpluta.base.api.internal.object.Placeable; import com.bartlomiejpluta.base.api.internal.object.Placeable;
import com.bartlomiejpluta.base.api.internal.render.Renderable; import com.bartlomiejpluta.base.api.internal.render.Renderable;
import org.joml.Vector2ic; import org.joml.Vector2ic;
public interface Animation extends Placeable, Renderable, Updatable { public interface Animation extends Placeable, Renderable, Updatable {
void setStepSize(float x, float y); void setStepSize(float x, float y);
Vector2ic getCoordinates(); Vector2ic getCoordinates();
@@ -17,17 +15,11 @@ public interface Animation extends Placeable, Renderable, Updatable {
void setCoordinates(int x, int y); void setCoordinates(int x, int y);
Movement prepareMovement(Direction direction);
Movement getMovement();
void setSpeed(float speed);
void setAnimationSpeed(float speed); void setAnimationSpeed(float speed);
boolean isMoving(); Integer getRepeat();
void onAdd(ObjectLayer layer); void setRepeat(Integer repeat);
void onRemove(ObjectLayer layer); boolean finished();
} }

View File

@@ -1,5 +1,6 @@
package com.bartlomiejpluta.base.api.game.context; 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.camera.Camera;
import com.bartlomiejpluta.base.api.game.entity.Entity; import com.bartlomiejpluta.base.api.game.entity.Entity;
import com.bartlomiejpluta.base.api.game.gui.base.GUI; import com.bartlomiejpluta.base.api.game.gui.base.GUI;
@@ -28,6 +29,8 @@ public interface Context extends Updatable, Renderable, Disposable {
Entity createEntity(String entitySetUid); Entity createEntity(String entitySetUid);
Animation createAnimation(String animationUid);
Image getImage(String imageUid); Image getImage(String imageUid);
GUI newGUI(); GUI newGUI();

View File

@@ -1,9 +1,12 @@
package com.bartlomiejpluta.base.api.game.map.layer.base; 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.game.map.model.GameMap;
import com.bartlomiejpluta.base.api.internal.logic.Updatable; import com.bartlomiejpluta.base.api.internal.logic.Updatable;
import com.bartlomiejpluta.base.api.internal.render.Renderable; import com.bartlomiejpluta.base.api.internal.render.Renderable;
public interface Layer extends Renderable, Updatable { public interface Layer extends Renderable, Updatable {
GameMap getMap(); GameMap getMap();
void pushAnimation(Animation animation);
} }

View File

@@ -17,6 +17,8 @@ public interface GameMap {
Vector2fc getSize(); Vector2fc getSize();
Vector2fc getStepSize();
TileLayer getTileLayer(int layerIndex); TileLayer getTileLayer(int layerIndex);
ImageLayer getImageLayer(int layerIndex); ImageLayer getImageLayer(int layerIndex);

View File

@@ -64,6 +64,7 @@ public class DefaultContextManager implements ContextManager {
return DefaultContext.builder() return DefaultContext.builder()
.engine(engine) .engine(engine)
.entityManager(entityManager) .entityManager(entityManager)
.animationManager(animationManager)
.imageManager(imageManager) .imageManager(imageManager)
.mapManager(mapManager) .mapManager(mapManager)
.fontManager(fontManager) .fontManager(fontManager)

View File

@@ -1,5 +1,6 @@
package com.bartlomiejpluta.base.engine.context.model; 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.camera.Camera;
import com.bartlomiejpluta.base.api.game.context.Context; import com.bartlomiejpluta.base.api.game.context.Context;
import com.bartlomiejpluta.base.api.game.entity.Entity; 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.manager.WidgetDefinitionManager;
import com.bartlomiejpluta.base.engine.gui.render.NanoVGGUI; import com.bartlomiejpluta.base.engine.gui.render.NanoVGGUI;
import com.bartlomiejpluta.base.engine.gui.xml.inflater.Inflater; 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.entity.manager.EntityManager;
import com.bartlomiejpluta.base.engine.world.image.manager.ImageManager; import com.bartlomiejpluta.base.engine.world.image.manager.ImageManager;
import com.bartlomiejpluta.base.engine.world.map.manager.MapManager; import com.bartlomiejpluta.base.engine.world.map.manager.MapManager;
@@ -38,6 +40,9 @@ public class DefaultContext implements Context {
@NonNull @NonNull
private final EntityManager entityManager; private final EntityManager entityManager;
@NonNull
private final AnimationManager animationManager;
@NonNull @NonNull
private final ImageManager imageManager; private final ImageManager imageManager;
@@ -108,6 +113,11 @@ public class DefaultContext implements Context {
return entityManager.createEntity(entitySetUid); return entityManager.createEntity(entitySetUid);
} }
@Override
public Animation createAnimation(String animationUid) {
return animationManager.loadObject(animationUid);
}
@Override @Override
public Image getImage(@NonNull String imageUid) { public Image getImage(@NonNull String imageUid) {
return imageManager.loadObject(imageUid); return imageManager.loadObject(imageUid);

View File

@@ -57,6 +57,8 @@ public class DefaultAnimationManager implements AnimationManager {
} }
private Vector2fc[] createFrames(int rows, int columns) { private Vector2fc[] createFrames(int rows, int columns) {
log.info("Caching [{}x{}] animation ([{}] frames)", columns, rows, columns * rows);
var frames = new Vector2fc[rows * columns]; var frames = new Vector2fc[rows * columns];
for (int row = 0; row < rows; ++row) { for (int row = 0; row < rows; ++row) {

View File

@@ -13,6 +13,7 @@ import org.joml.Vector2fc;
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
public abstract class AnimatedSprite extends Sprite implements Updatable { public abstract class AnimatedSprite extends Sprite implements Updatable {
private int time; private int time;
protected int currentAnimationFrame;
public AnimatedSprite(Mesh mesh, Material material) { public AnimatedSprite(Mesh mesh, Material material) {
super(mesh, material); super(mesh, material);
@@ -40,8 +41,8 @@ public abstract class AnimatedSprite extends Sprite implements Updatable {
if (shouldAnimate()) { if (shouldAnimate()) {
var positions = getSpriteAnimationFramesPositions(); var positions = getSpriteAnimationFramesPositions();
var delay = getAnimationSpeed(); var delay = getAnimationSpeed();
var currentPosition = ((time % (positions.length * delay)) / delay); currentAnimationFrame = ((time % (positions.length * delay)) / delay);
var current = positions[currentPosition]; var current = positions[currentAnimationFrame];
material.setSpritePosition(current); material.setSpritePosition(current);
} }
} }

View File

@@ -1,26 +1,31 @@
package com.bartlomiejpluta.base.engine.world.animation.model; package com.bartlomiejpluta.base.engine.world.animation.model;
import com.bartlomiejpluta.base.api.game.animation.Animation; 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.api.util.math.MathUtil;
import com.bartlomiejpluta.base.engine.core.gl.object.material.Material; 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.core.gl.object.mesh.Mesh;
import com.bartlomiejpluta.base.engine.world.movement.MovableSprite; import com.bartlomiejpluta.base.engine.world.movement.MovableSprite;
import lombok.Getter;
import lombok.NonNull; import lombok.NonNull;
import lombok.Setter;
import org.joml.Vector2fc; import org.joml.Vector2fc;
public class DefaultAnimation extends MovableSprite implements Animation { public class DefaultAnimation extends MovableSprite implements Animation {
private final Vector2fc[] frames; private final Vector2fc[] frames;
private final int lastFrameIndex;
private int animationSpeed = 100; 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) { public DefaultAnimation(Mesh mesh, Material material, @NonNull Vector2fc[] frames) {
super(mesh, material); super(mesh, material);
this.frames = frames; this.frames = frames;
} this.lastFrameIndex = frames.length - 1;
@Override
public void setSpeed(float speed) {
framesToCrossOneTile = (int) (1 / MathUtil.clamp(speed, Float.MIN_VALUE, 1.0));
} }
@Override @Override
@@ -28,16 +33,6 @@ public class DefaultAnimation extends MovableSprite implements Animation {
animationSpeed = (int) (1 / MathUtil.clamp(speed, Float.MIN_VALUE, 1.0)); 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 @Override
public int getAnimationSpeed() { public int getAnimationSpeed() {
return animationSpeed; return animationSpeed;
@@ -57,4 +52,22 @@ public class DefaultAnimation extends MovableSprite implements Animation {
protected void setDefaultAnimationFrame() { protected void setDefaultAnimationFrame() {
// do nothing // 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;
}
} }

View File

@@ -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<Animation> 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);
}
}
}

View File

@@ -1,21 +1,28 @@
package com.bartlomiejpluta.base.engine.world.map.layer.color; 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.layer.color.ColorLayer;
import com.bartlomiejpluta.base.api.game.map.model.GameMap; 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.core.gl.object.material.Material;
import com.bartlomiejpluta.base.engine.util.mesh.MeshManager; 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 com.bartlomiejpluta.base.engine.world.object.Sprite;
import lombok.Getter;
import lombok.NonNull; import lombok.NonNull;
import org.joml.Matrix4fc;
import org.joml.Vector2fc;
public class DefaultColorLayer extends Sprite implements ColorLayer { public class DefaultColorLayer extends BaseLayer implements ColorLayer {
private final Color color;
@Getter private final Material material;
private final GameMap map;
public DefaultColorLayer(@NonNull GameMap map, @NonNull MeshManager meshManager, float red, float green, float blue, float alpha) { 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)); super(map);
this.map = map; this.color = new Color(meshManager, red, green, blue, alpha);
this.material = color.getMaterial();
setScale(map.getWidth(), map.getHeight()); setScale(map.getWidth(), map.getHeight());
} }
@@ -50,7 +57,94 @@ public class DefaultColorLayer extends Sprite implements ColorLayer {
} }
@Override @Override
public void update(float dt) { public Vector2fc getPosition() {
// Do nothing 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));
}
} }
} }

View File

@@ -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.map.model.GameMap;
import com.bartlomiejpluta.base.api.game.screen.Screen; import com.bartlomiejpluta.base.api.game.screen.Screen;
import com.bartlomiejpluta.base.api.internal.render.ShaderManager; import com.bartlomiejpluta.base.api.internal.render.ShaderManager;
import com.bartlomiejpluta.base.engine.world.map.layer.base.BaseLayer;
import lombok.Getter; import lombok.Getter;
import lombok.NonNull; import lombok.NonNull;
import lombok.Setter; import lombok.Setter;
public class DefaultImageLayer implements ImageLayer { public class DefaultImageLayer extends BaseLayer implements ImageLayer {
private final float mapWidth; private final float mapWidth;
private final float mapHeight; private final float mapHeight;
@Getter
private final GameMap map;
@NonNull @NonNull
@Getter @Getter
private Image image; private Image image;
@@ -40,7 +38,7 @@ public class DefaultImageLayer implements ImageLayer {
private boolean parallax; private boolean parallax;
public DefaultImageLayer(GameMap map, Image image, float opacity, float x, float y, float scaleX, float scaleY, ImageLayerMode mode, 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.mapWidth = map.getWidth();
this.mapHeight = map.getHeight(); this.mapHeight = map.getHeight();
@@ -108,11 +106,6 @@ public class DefaultImageLayer implements ImageLayer {
recalculate(); recalculate();
} }
@Override
public void update(float dt) {
// Do nothing
}
@Override @Override
public void render(Screen screen, Camera camera, ShaderManager shaderManager) { public void render(Screen screen, Camera camera, ShaderManager shaderManager) {
if (image != null) { if (image != null) {
@@ -127,5 +120,7 @@ public class DefaultImageLayer implements ImageLayer {
image.render(screen, camera, shaderManager); image.render(screen, camera, shaderManager);
} }
super.render(screen, camera, shaderManager);
} }
} }

View File

@@ -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.rule.Rule;
import com.bartlomiejpluta.base.api.game.screen.Screen; import com.bartlomiejpluta.base.api.game.screen.Screen;
import com.bartlomiejpluta.base.api.internal.render.ShaderManager; import com.bartlomiejpluta.base.api.internal.render.ShaderManager;
import com.bartlomiejpluta.base.engine.world.map.layer.base.BaseLayer;
import lombok.Getter; import lombok.Getter;
import lombok.NonNull; import lombok.NonNull;
import org.joml.Vector2fc;
import org.joml.Vector2ic; import org.joml.Vector2ic;
import java.util.ArrayList; import java.util.ArrayList;
@@ -20,10 +20,7 @@ import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Queue; import java.util.Queue;
public class DefaultObjectLayer implements ObjectLayer { public class DefaultObjectLayer extends BaseLayer implements ObjectLayer {
@Getter
private final GameMap map;
@Getter @Getter
private final List<Entity> entities; private final List<Entity> entities;
@@ -40,13 +37,11 @@ public class DefaultObjectLayer implements ObjectLayer {
private final int rows; private final int rows;
private final int columns; private final int columns;
private final Vector2fc stepSize;
public DefaultObjectLayer(@NonNull GameMap map, int rows, int columns, @NonNull Vector2fc stepSize, List<Entity> entities, PassageAbility[][] passageMap) { public DefaultObjectLayer(@NonNull GameMap map, int rows, int columns, List<Entity> entities, PassageAbility[][] passageMap) {
this.map = map; super(map);
this.rows = rows; this.rows = rows;
this.columns = columns; this.columns = columns;
this.stepSize = stepSize;
this.entities = entities; this.entities = entities;
this.passageMap = passageMap; this.passageMap = passageMap;
} }
@@ -126,6 +121,8 @@ public class DefaultObjectLayer implements ObjectLayer {
@Override @Override
public void update(float dt) { public void update(float dt) {
super.update(dt);
while (!movements.isEmpty()) { while (!movements.isEmpty()) {
var movement = movements.poll(); var movement = movements.poll();
if (isTileReachable(movement.getTo())) { if (isTileReachable(movement.getTo())) {
@@ -171,6 +168,8 @@ public class DefaultObjectLayer implements ObjectLayer {
for (var object : entities) { for (var object : entities) {
object.render(screen, camera, shaderManager); object.render(screen, camera, shaderManager);
} }
super.render(screen, camera, shaderManager);
} }
private int compareObjects(Entity a, Entity b) { private int compareObjects(Entity a, Entity b) {

View File

@@ -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.map.model.GameMap;
import com.bartlomiejpluta.base.api.game.screen.Screen; import com.bartlomiejpluta.base.api.game.screen.Screen;
import com.bartlomiejpluta.base.api.internal.render.ShaderManager; 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.Tile;
import com.bartlomiejpluta.base.engine.world.tileset.model.TileSet; import com.bartlomiejpluta.base.engine.world.tileset.model.TileSet;
import lombok.Getter;
import lombok.NonNull; import lombok.NonNull;
import java.util.Arrays; import java.util.Arrays;
public class DefaultTileLayer implements TileLayer { public class DefaultTileLayer extends BaseLayer implements TileLayer {
private final TileSet tileSet; private final TileSet tileSet;
private final Tile[][] layer; private final Tile[][] layer;
@Getter
private final GameMap map;
public DefaultTileLayer(@NonNull GameMap map, @NonNull TileSet tileSet, int rows, int columns) { public DefaultTileLayer(@NonNull GameMap map, @NonNull TileSet tileSet, int rows, int columns) {
this.map = map; super(map);
this.tileSet = tileSet; this.tileSet = tileSet;
layer = new Tile[rows][columns]; layer = new Tile[rows][columns];
Arrays.stream(layer).forEach(tiles -> Arrays.fill(tiles, null)); Arrays.stream(layer).forEach(tiles -> Arrays.fill(tiles, null));
@@ -46,11 +43,6 @@ public class DefaultTileLayer implements TileLayer {
layer[row][column] = null; layer[row][column] = null;
} }
@Override
public void update(float dt) {
// Do nothing
}
@Override @Override
public void render(Screen screen, Camera camera, ShaderManager shaderManager) { public void render(Screen screen, Camera camera, ShaderManager shaderManager) {
for (var row : layer) { for (var row : layer) {
@@ -60,5 +52,7 @@ public class DefaultTileLayer implements TileLayer {
} }
} }
} }
super.render(screen, camera, shaderManager);
} }
} }

View File

@@ -130,7 +130,7 @@ public class DefaultGameMap implements Renderable, Updatable, GameMap {
Arrays.fill(passageMap[i], 0, columns, PassageAbility.ALLOW); 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); layers.add(layer);