Extract ObjectLayer interface to :api

This commit is contained in:
2021-03-03 20:59:17 +01:00
parent b31d8ab3f0
commit f5d29f7421
5 changed files with 92 additions and 80 deletions

View File

@@ -1,7 +1,5 @@
package com.bartlomiejpluta.base.api.game.map; 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; import org.joml.Vector2f;
public interface GameMap { public interface GameMap {
@@ -21,11 +19,5 @@ public interface GameMap {
ColorLayer getColorLayer(int layerIndex); ColorLayer getColorLayer(int layerIndex);
void addEntity(int objectLayerIndex, Entity entity); ObjectLayer getObjectLayer(int layerIndex);
void removeEntity(int objectLayerIndex, Entity entity);
boolean isMovementPossible(int objectLayerIndex, Movement movement);
void setPassageAbility(int objectLayerIndex, int row, int column, PassageAbility passageAbility);
} }

View File

@@ -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<Entity> getEntities();
void setPassageAbility(int row, int column, PassageAbility passageAbility);
PassageAbility[][] getPassageMap();
boolean isMovementPossible(Movement movement);
}

View File

@@ -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.camera.Camera;
import com.bartlomiejpluta.base.api.game.entity.Direction; import com.bartlomiejpluta.base.api.game.entity.Direction;
import com.bartlomiejpluta.base.api.game.entity.Entity; 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.map.PassageAbility;
import com.bartlomiejpluta.base.api.game.window.Window; import com.bartlomiejpluta.base.api.game.window.Window;
import com.bartlomiejpluta.base.api.internal.render.ShaderManager; 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; import java.util.List;
public class ObjectLayer implements Layer { public class DefaultObjectLayer implements ObjectLayer {
private final List<Entity> objects;
@Getter
private final List<Entity> entities;
@Getter
private final PassageAbility[][] passageMap; private final PassageAbility[][] passageMap;
public ObjectLayer(List<Entity> objects, PassageAbility[][] passageMap) { private final int rows;
this.objects = objects; private final int columns;
private final Vector2f stepSize;
public DefaultObjectLayer(int rows, int columns, @NonNull Vector2f stepSize, List<Entity> entities, PassageAbility[][] passageMap) {
this.rows = rows;
this.columns = columns;
this.stepSize = stepSize;
this.entities = entities;
this.passageMap = passageMap; this.passageMap = passageMap;
} }
public void addObject(Entity object) { @Override
objects.add(object); public void addEntity(Entity entity) {
((DefaultEntity) entity).setStepSize(stepSize.x, stepSize.y);
entities.add(entity);
} }
public void removeObject(Entity object) { @Override
objects.remove(object); public void removeEntity(Entity entity) {
entities.remove(entity);
} }
@Override
public void setPassageAbility(int row, int column, PassageAbility passageAbility) { public void setPassageAbility(int row, int column, PassageAbility passageAbility) {
passageMap[row][column] = 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]) { var isTargetReachable = switch (passageMap[target.y][target.x]) {
case UP_ONLY -> direction != Direction.DOWN; case UP_ONLY -> direction != Direction.DOWN;
case DOWN_ONLY -> direction != Direction.UP; case DOWN_ONLY -> direction != Direction.UP;
@@ -55,10 +84,17 @@ public class ObjectLayer implements Layer {
} }
@Override @Override
public void render(Window window, Camera camera, ShaderManager shaderManager) { public void update(float dt) {
objects.sort(this::compareObjects); 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); object.render(window, camera, shaderManager);
} }
} }
@@ -66,11 +102,4 @@ public class ObjectLayer implements Layer {
private int compareObjects(Entity a, Entity b) { private int compareObjects(Entity a, Entity b) {
return Float.compare(a.getPosition().y, b.getPosition().y); return Float.compare(a.getPosition().y, b.getPosition().y);
} }
@Override
public void update(float dt) {
for (var object : objects) {
object.update(dt);
}
}
} }

View File

@@ -1,18 +1,15 @@
package com.bartlomiejpluta.base.engine.world.map.model; package com.bartlomiejpluta.base.engine.world.map.model;
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.Movement;
import com.bartlomiejpluta.base.api.game.map.*; import com.bartlomiejpluta.base.api.game.map.*;
import com.bartlomiejpluta.base.api.game.window.Window; import com.bartlomiejpluta.base.api.game.window.Window;
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;
import com.bartlomiejpluta.base.api.internal.render.ShaderManager; import com.bartlomiejpluta.base.api.internal.render.ShaderManager;
import com.bartlomiejpluta.base.engine.util.mesh.MeshManager; 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.color.DefaultColorLayer;
import com.bartlomiejpluta.base.engine.world.map.layer.image.DefaultImageLayer; 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.map.layer.tile.DefaultTileLayer;
import com.bartlomiejpluta.base.engine.world.tileset.model.TileSet; import com.bartlomiejpluta.base.engine.world.tileset.model.TileSet;
import lombok.Getter; import lombok.Getter;
@@ -60,16 +57,16 @@ public class DefaultGameMap implements Renderable, Updatable, GameMap {
} }
@Override @Override
public void render(Window window, Camera camera, ShaderManager shaderManager) { public void update(float dt) {
for (var layer : layers) { for (var layer : layers) {
layer.render(window, camera, shaderManager); layer.update(dt);
} }
} }
@Override @Override
public void update(float dt) { public void render(Window window, Camera camera, ShaderManager shaderManager) {
for (var layer : layers) { 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); return (ColorLayer) layers.get(layerIndex);
} }
public int createObjectLayer() { @Override
var passageMap = new PassageAbility[rows][columns]; public ObjectLayer getObjectLayer(int layerIndex) {
for (int i = 0; i < rows; ++i) { return (ObjectLayer) layers.get(layerIndex);
Arrays.fill(passageMap[i], 0, columns, PassageAbility.ALLOW);
}
layers.add(new ObjectLayer(new ArrayList<>(), passageMap));
return layers.size() - 1;
} }
public TileLayer createTileLayer() { public TileLayer createTileLayer() {
@@ -111,13 +102,6 @@ public class DefaultGameMap implements Renderable, Updatable, GameMap {
return layer; 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) { 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); var layer = new DefaultImageLayer(this, image, opacity, x, y, scaleX, scaleY, mode, parallax);
layers.add(layer); layers.add(layer);
@@ -125,36 +109,23 @@ public class DefaultGameMap implements Renderable, Updatable, GameMap {
return layer; return layer;
} }
@Override public ColorLayer createColorLayer(MeshManager meshManager, float red, float green, float blue, float alpha) {
public void addEntity(int objectLayerIndex, Entity entity) { var layer = new DefaultColorLayer(meshManager, this, red, green, blue, alpha);
var object = (DefaultEntity) entity; layers.add(layer);
object.setStepSize(stepSize.x, stepSize.y);
((ObjectLayer) layers.get(objectLayerIndex)).addObject(object); return layer;
} }
@Override public ObjectLayer createObjectLayer() {
public void removeEntity(int objectLayerIndex, Entity entity) { var passageMap = new PassageAbility[rows][columns];
((ObjectLayer) layers.get(objectLayerIndex)).removeObject(entity); for (int i = 0; i < rows; ++i) {
Arrays.fill(passageMap[i], 0, columns, PassageAbility.ALLOW);
} }
@Override var layer = new DefaultObjectLayer(rows, columns, stepSize, new ArrayList<>(), passageMap);
public void setPassageAbility(int objectLayerIndex, int row, int column, PassageAbility passageAbility) {
((ObjectLayer) layers.get(objectLayerIndex)).setPassageAbility(row, column, passageAbility);
}
@Override layers.add(layer);
public boolean isMovementPossible(int objectLayerIndex, Movement movement) {
var target = movement.getTo();
// Is trying to go beyond the map return layer;
if (target.x < 0 || target.y < 0 || target.x >= columns || target.y >= rows) {
return false;
}
var source = movement.getFrom();
var direction = movement.getDirection();
return ((ObjectLayer) layers.get(objectLayerIndex)).isMovementPossible(source, target, direction);
} }
} }

View File

@@ -70,7 +70,7 @@ public class ProtobufMapDeserializer extends MapDeserializer {
var passageMap = proto.getObjectLayer().getPassageMapList(); var passageMap = proto.getObjectLayer().getPassageMapList();
for (var i = 0; i < passageMap.size(); ++i) { 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 ALLOW -> PassageAbility.ALLOW;
case BLOCK -> PassageAbility.BLOCK; case BLOCK -> PassageAbility.BLOCK;
case RIGHT_ONLY -> PassageAbility.RIGHT_ONLY; case RIGHT_ONLY -> PassageAbility.RIGHT_ONLY;