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

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

View File

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

View File

@@ -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;