Extract ObjectLayer interface to :api
This commit is contained in:
@@ -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);
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
@@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -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
|
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var source = movement.getFrom();
|
var layer = new DefaultObjectLayer(rows, columns, stepSize, new ArrayList<>(), passageMap);
|
||||||
var direction = movement.getDirection();
|
|
||||||
|
|
||||||
return ((ObjectLayer) layers.get(objectLayerIndex)).isMovementPossible(source, target, direction);
|
layers.add(layer);
|
||||||
|
|
||||||
|
return layer;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user