From f5d29f7421f598c1e72ce0c417c0415c03345ab6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Przemys=C5=82aw=20Pluta?= Date: Wed, 3 Mar 2021 20:59:17 +0100 Subject: [PATCH] Extract ObjectLayer interface to :api --- .../base/api/game/map/GameMap.java | 10 +-- .../base/api/game/map/ObjectLayer.java | 20 ++++++ ...jectLayer.java => DefaultObjectLayer.java} | 71 +++++++++++++------ .../world/map/model/DefaultGameMap.java | 69 ++++++------------ .../map/serial/ProtobufMapDeserializer.java | 2 +- 5 files changed, 92 insertions(+), 80 deletions(-) create mode 100644 api/src/main/java/com/bartlomiejpluta/base/api/game/map/ObjectLayer.java rename engine/src/main/java/com/bartlomiejpluta/base/engine/world/map/layer/object/{ObjectLayer.java => DefaultObjectLayer.java} (55%) diff --git a/api/src/main/java/com/bartlomiejpluta/base/api/game/map/GameMap.java b/api/src/main/java/com/bartlomiejpluta/base/api/game/map/GameMap.java index 4c8d3ffa..0aa6371c 100644 --- a/api/src/main/java/com/bartlomiejpluta/base/api/game/map/GameMap.java +++ b/api/src/main/java/com/bartlomiejpluta/base/api/game/map/GameMap.java @@ -1,7 +1,5 @@ package com.bartlomiejpluta.base.api.game.map; -import com.bartlomiejpluta.base.api.game.entity.Entity; -import com.bartlomiejpluta.base.api.game.entity.Movement; import org.joml.Vector2f; public interface GameMap { @@ -21,11 +19,5 @@ public interface GameMap { ColorLayer getColorLayer(int layerIndex); - void addEntity(int objectLayerIndex, Entity entity); - - void removeEntity(int objectLayerIndex, Entity entity); - - boolean isMovementPossible(int objectLayerIndex, Movement movement); - - void setPassageAbility(int objectLayerIndex, int row, int column, PassageAbility passageAbility); + ObjectLayer getObjectLayer(int layerIndex); } diff --git a/api/src/main/java/com/bartlomiejpluta/base/api/game/map/ObjectLayer.java b/api/src/main/java/com/bartlomiejpluta/base/api/game/map/ObjectLayer.java new file mode 100644 index 00000000..53eaff9d --- /dev/null +++ b/api/src/main/java/com/bartlomiejpluta/base/api/game/map/ObjectLayer.java @@ -0,0 +1,20 @@ +package com.bartlomiejpluta.base.api.game.map; + +import com.bartlomiejpluta.base.api.game.entity.Entity; +import com.bartlomiejpluta.base.api.game.entity.Movement; + +import java.util.List; + +public interface ObjectLayer extends Layer { + void addEntity(Entity entity); + + void removeEntity(Entity entity); + + List getEntities(); + + void setPassageAbility(int row, int column, PassageAbility passageAbility); + + PassageAbility[][] getPassageMap(); + + boolean isMovementPossible(Movement movement); +} diff --git a/engine/src/main/java/com/bartlomiejpluta/base/engine/world/map/layer/object/ObjectLayer.java b/engine/src/main/java/com/bartlomiejpluta/base/engine/world/map/layer/object/DefaultObjectLayer.java similarity index 55% rename from engine/src/main/java/com/bartlomiejpluta/base/engine/world/map/layer/object/ObjectLayer.java rename to engine/src/main/java/com/bartlomiejpluta/base/engine/world/map/layer/object/DefaultObjectLayer.java index 8c8a5479..76100f44 100644 --- a/engine/src/main/java/com/bartlomiejpluta/base/engine/world/map/layer/object/ObjectLayer.java +++ b/engine/src/main/java/com/bartlomiejpluta/base/engine/world/map/layer/object/DefaultObjectLayer.java @@ -3,37 +3,66 @@ package com.bartlomiejpluta.base.engine.world.map.layer.object; import com.bartlomiejpluta.base.api.game.camera.Camera; import com.bartlomiejpluta.base.api.game.entity.Direction; import com.bartlomiejpluta.base.api.game.entity.Entity; -import com.bartlomiejpluta.base.api.game.map.Layer; +import com.bartlomiejpluta.base.api.game.entity.Movement; +import com.bartlomiejpluta.base.api.game.map.ObjectLayer; import com.bartlomiejpluta.base.api.game.map.PassageAbility; import com.bartlomiejpluta.base.api.game.window.Window; import com.bartlomiejpluta.base.api.internal.render.ShaderManager; -import org.joml.Vector2i; +import com.bartlomiejpluta.base.engine.world.entity.model.DefaultEntity; +import lombok.Getter; +import lombok.NonNull; +import org.joml.Vector2f; import java.util.List; -public class ObjectLayer implements Layer { - private final List objects; +public class DefaultObjectLayer implements ObjectLayer { + @Getter + private final List entities; + + @Getter private final PassageAbility[][] passageMap; - public ObjectLayer(List objects, PassageAbility[][] passageMap) { - this.objects = objects; + private final int rows; + private final int columns; + private final Vector2f stepSize; + + public DefaultObjectLayer(int rows, int columns, @NonNull Vector2f stepSize, List entities, PassageAbility[][] passageMap) { + this.rows = rows; + this.columns = columns; + this.stepSize = stepSize; + this.entities = entities; this.passageMap = passageMap; } - public void addObject(Entity object) { - objects.add(object); + @Override + public void addEntity(Entity entity) { + ((DefaultEntity) entity).setStepSize(stepSize.x, stepSize.y); + entities.add(entity); } - public void removeObject(Entity object) { - objects.remove(object); + @Override + public void removeEntity(Entity entity) { + entities.remove(entity); } + @Override public void setPassageAbility(int row, int column, PassageAbility passageAbility) { passageMap[row][column] = passageAbility; } - public boolean isMovementPossible(Vector2i source, Vector2i target, Direction direction) { + @Override + public boolean isMovementPossible(Movement movement) { + var target = movement.getTo(); + + // Is trying to go beyond the map + if (target.x < 0 || target.y < 0 || target.x >= columns || target.y >= rows) { + return false; + } + + var source = movement.getFrom(); + var direction = movement.getDirection(); + var isTargetReachable = switch (passageMap[target.y][target.x]) { case UP_ONLY -> direction != Direction.DOWN; case DOWN_ONLY -> direction != Direction.UP; @@ -55,10 +84,17 @@ public class ObjectLayer implements Layer { } @Override - public void render(Window window, Camera camera, ShaderManager shaderManager) { - objects.sort(this::compareObjects); + public void update(float dt) { + for (var object : entities) { + object.update(dt); + } + } - for (var object : objects) { + @Override + public void render(Window window, Camera camera, ShaderManager shaderManager) { + entities.sort(this::compareObjects); + + for (var object : entities) { object.render(window, camera, shaderManager); } } @@ -66,11 +102,4 @@ public class ObjectLayer implements Layer { private int compareObjects(Entity a, Entity b) { return Float.compare(a.getPosition().y, b.getPosition().y); } - - @Override - public void update(float dt) { - for (var object : objects) { - object.update(dt); - } - } } 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 b65c6122..28972a68 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 @@ -1,18 +1,15 @@ package com.bartlomiejpluta.base.engine.world.map.model; import com.bartlomiejpluta.base.api.game.camera.Camera; -import com.bartlomiejpluta.base.api.game.entity.Entity; -import com.bartlomiejpluta.base.api.game.entity.Movement; import com.bartlomiejpluta.base.api.game.map.*; import com.bartlomiejpluta.base.api.game.window.Window; import com.bartlomiejpluta.base.api.internal.logic.Updatable; import com.bartlomiejpluta.base.api.internal.render.Renderable; import com.bartlomiejpluta.base.api.internal.render.ShaderManager; import com.bartlomiejpluta.base.engine.util.mesh.MeshManager; -import com.bartlomiejpluta.base.engine.world.entity.model.DefaultEntity; import com.bartlomiejpluta.base.engine.world.map.layer.color.DefaultColorLayer; import com.bartlomiejpluta.base.engine.world.map.layer.image.DefaultImageLayer; -import com.bartlomiejpluta.base.engine.world.map.layer.object.ObjectLayer; +import com.bartlomiejpluta.base.engine.world.map.layer.object.DefaultObjectLayer; import com.bartlomiejpluta.base.engine.world.map.layer.tile.DefaultTileLayer; import com.bartlomiejpluta.base.engine.world.tileset.model.TileSet; import lombok.Getter; @@ -60,16 +57,16 @@ public class DefaultGameMap implements Renderable, Updatable, GameMap { } @Override - public void render(Window window, Camera camera, ShaderManager shaderManager) { + public void update(float dt) { for (var layer : layers) { - layer.render(window, camera, shaderManager); + layer.update(dt); } } @Override - public void update(float dt) { + public void render(Window window, Camera camera, ShaderManager shaderManager) { for (var layer : layers) { - layer.update(dt); + layer.render(window, camera, shaderManager); } } @@ -93,15 +90,9 @@ public class DefaultGameMap implements Renderable, Updatable, GameMap { return (ColorLayer) layers.get(layerIndex); } - public int createObjectLayer() { - var passageMap = new PassageAbility[rows][columns]; - for (int i = 0; i < rows; ++i) { - Arrays.fill(passageMap[i], 0, columns, PassageAbility.ALLOW); - } - - layers.add(new ObjectLayer(new ArrayList<>(), passageMap)); - - return layers.size() - 1; + @Override + public ObjectLayer getObjectLayer(int layerIndex) { + return (ObjectLayer) layers.get(layerIndex); } public TileLayer createTileLayer() { @@ -111,13 +102,6 @@ public class DefaultGameMap implements Renderable, Updatable, GameMap { return layer; } - public ColorLayer createColorLayer(MeshManager meshManager, float red, float green, float blue, float alpha) { - var layer = new DefaultColorLayer(meshManager, this, red, green, blue, alpha); - layers.add(layer); - - return layer; - } - public ImageLayer createImageLayer(Image image, float opacity, float x, float y, float scaleX, float scaleY, ImageLayerMode mode, boolean parallax) { var layer = new DefaultImageLayer(this, image, opacity, x, y, scaleX, scaleY, mode, parallax); layers.add(layer); @@ -125,36 +109,23 @@ public class DefaultGameMap implements Renderable, Updatable, GameMap { return layer; } - @Override - public void addEntity(int objectLayerIndex, Entity entity) { - var object = (DefaultEntity) entity; - object.setStepSize(stepSize.x, stepSize.y); + public ColorLayer createColorLayer(MeshManager meshManager, float red, float green, float blue, float alpha) { + var layer = new DefaultColorLayer(meshManager, this, red, green, blue, alpha); + layers.add(layer); - ((ObjectLayer) layers.get(objectLayerIndex)).addObject(object); + return layer; } - @Override - public void removeEntity(int objectLayerIndex, Entity entity) { - ((ObjectLayer) layers.get(objectLayerIndex)).removeObject(entity); - } - - @Override - public void setPassageAbility(int objectLayerIndex, int row, int column, PassageAbility passageAbility) { - ((ObjectLayer) layers.get(objectLayerIndex)).setPassageAbility(row, column, passageAbility); - } - - @Override - public boolean isMovementPossible(int objectLayerIndex, Movement movement) { - var target = movement.getTo(); - - // Is trying to go beyond the map - if (target.x < 0 || target.y < 0 || target.x >= columns || target.y >= rows) { - return false; + public ObjectLayer createObjectLayer() { + var passageMap = new PassageAbility[rows][columns]; + for (int i = 0; i < rows; ++i) { + Arrays.fill(passageMap[i], 0, columns, PassageAbility.ALLOW); } - var source = movement.getFrom(); - var direction = movement.getDirection(); + var layer = new DefaultObjectLayer(rows, columns, stepSize, new ArrayList<>(), passageMap); - return ((ObjectLayer) layers.get(objectLayerIndex)).isMovementPossible(source, target, direction); + layers.add(layer); + + return layer; } } diff --git a/engine/src/main/java/com/bartlomiejpluta/base/engine/world/map/serial/ProtobufMapDeserializer.java b/engine/src/main/java/com/bartlomiejpluta/base/engine/world/map/serial/ProtobufMapDeserializer.java index 4ac9ceb5..386471b5 100644 --- a/engine/src/main/java/com/bartlomiejpluta/base/engine/world/map/serial/ProtobufMapDeserializer.java +++ b/engine/src/main/java/com/bartlomiejpluta/base/engine/world/map/serial/ProtobufMapDeserializer.java @@ -70,7 +70,7 @@ public class ProtobufMapDeserializer extends MapDeserializer { var passageMap = proto.getObjectLayer().getPassageMapList(); for (var i = 0; i < passageMap.size(); ++i) { - map.setPassageAbility(layer, i / columns, i % columns, switch (passageMap.get(i)) { + layer.setPassageAbility(i / columns, i % columns, switch (passageMap.get(i)) { case ALLOW -> PassageAbility.ALLOW; case BLOCK -> PassageAbility.BLOCK; case RIGHT_ONLY -> PassageAbility.RIGHT_ONLY;