Extract ObjectLayer interface to :api
This commit is contained in:
@@ -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<Entity> objects;
|
||||
public class DefaultObjectLayer implements ObjectLayer {
|
||||
|
||||
@Getter
|
||||
private final List<Entity> entities;
|
||||
|
||||
@Getter
|
||||
private final PassageAbility[][] passageMap;
|
||||
|
||||
public ObjectLayer(List<Entity> 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<Entity> 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user