Create AbstractEntity class
This commit is contained in:
@@ -4,6 +4,7 @@ import com.bartlomiejpluta.base.api.animation.Animation;
|
||||
import com.bartlomiejpluta.base.api.audio.Sound;
|
||||
import com.bartlomiejpluta.base.api.camera.Camera;
|
||||
import com.bartlomiejpluta.base.api.character.Character;
|
||||
import com.bartlomiejpluta.base.api.entity.Entity;
|
||||
import com.bartlomiejpluta.base.api.event.Event;
|
||||
import com.bartlomiejpluta.base.api.event.EventType;
|
||||
import com.bartlomiejpluta.base.api.gui.GUI;
|
||||
@@ -44,6 +45,8 @@ public interface Context extends Updatable, Renderable, Disposable {
|
||||
|
||||
Animation createAnimation(String animationUid);
|
||||
|
||||
Entity createAbstractEntity();
|
||||
|
||||
Icon createIcon(String iconSetUid, int row, int column);
|
||||
|
||||
Image getImage(String imageUid);
|
||||
|
||||
@@ -0,0 +1,212 @@
|
||||
package com.bartlomiejpluta.base.lib.entity;
|
||||
|
||||
import com.bartlomiejpluta.base.api.camera.Camera;
|
||||
import com.bartlomiejpluta.base.api.entity.Entity;
|
||||
import com.bartlomiejpluta.base.api.event.Event;
|
||||
import com.bartlomiejpluta.base.api.location.Locationable;
|
||||
import com.bartlomiejpluta.base.api.map.layer.object.ObjectLayer;
|
||||
import com.bartlomiejpluta.base.api.move.Direction;
|
||||
import com.bartlomiejpluta.base.api.screen.Screen;
|
||||
import com.bartlomiejpluta.base.internal.object.Placeable;
|
||||
import com.bartlomiejpluta.base.internal.render.ShaderManager;
|
||||
import org.joml.Matrix4fc;
|
||||
import org.joml.Vector2fc;
|
||||
import org.joml.Vector2ic;
|
||||
|
||||
public abstract class EntityDelegate implements Entity {
|
||||
protected final Entity entity;
|
||||
|
||||
protected EntityDelegate(Entity entity) {
|
||||
this.entity = entity;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setStepSize(float x, float y) {
|
||||
entity.setStepSize(x, y);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Vector2ic getCoordinates() {
|
||||
return entity.getCoordinates();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setCoordinates(Vector2ic coordinates) {
|
||||
entity.setCoordinates(coordinates);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setCoordinates(int x, int y) {
|
||||
entity.setCoordinates(x, y);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Vector2fc getPositionOffset() {
|
||||
return entity.getPositionOffset();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setPositionOffset(Vector2fc offset) {
|
||||
entity.setPositionOffset(offset);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setPositionOffset(float offsetX, float offsetY) {
|
||||
entity.setPositionOffset(offsetX, offsetY);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int chebyshevDistance(Locationable other) {
|
||||
return entity.chebyshevDistance(other);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int manhattanDistance(Locationable other) {
|
||||
return entity.manhattanDistance(other);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Direction getDirectionTowards(Locationable target) {
|
||||
return entity.getDirectionTowards(target);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Vector2fc getPosition() {
|
||||
return entity.getPosition();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setPosition(Vector2fc position) {
|
||||
entity.setPosition(position);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setPosition(float x, float y) {
|
||||
entity.setPosition(x, y);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void movePosition(float x, float y) {
|
||||
entity.movePosition(x, y);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void movePosition(Vector2fc position) {
|
||||
entity.movePosition(position);
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getRotation() {
|
||||
return entity.getRotation();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setRotation(float rotation) {
|
||||
entity.setRotation(rotation);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void moveRotation(float rotation) {
|
||||
entity.moveRotation(rotation);
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getScaleX() {
|
||||
return entity.getScaleX();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setScaleX(float scale) {
|
||||
entity.setScaleX(scale);
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getScaleY() {
|
||||
return entity.getScaleY();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setScaleY(float scale) {
|
||||
entity.setScaleY(scale);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setScale(float scale) {
|
||||
entity.setScale(scale);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setScale(float scaleX, float scaleY) {
|
||||
entity.setScale(scaleX, scaleY);
|
||||
}
|
||||
|
||||
@Override
|
||||
public float euclideanDistance(Placeable other) {
|
||||
return entity.euclideanDistance(other);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int chebyshevDistance(Vector2ic coordinates) {
|
||||
return entity.chebyshevDistance(coordinates);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int manhattanDistance(Vector2ic coordinates) {
|
||||
return entity.manhattanDistance(coordinates);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Matrix4fc getModelMatrix() {
|
||||
return entity.getModelMatrix();
|
||||
}
|
||||
|
||||
@Override
|
||||
public ObjectLayer getLayer() {
|
||||
return entity.getLayer();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAdd(ObjectLayer layer) {
|
||||
entity.onAdd(layer);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onRemove(ObjectLayer layer) {
|
||||
entity.onRemove(layer);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isBlocking() {
|
||||
return entity.isBlocking();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setBlocking(boolean blocking) {
|
||||
entity.setBlocking(blocking);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getZIndex() {
|
||||
return entity.getZIndex();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setZIndex(int zIndex) {
|
||||
entity.setZIndex(zIndex);
|
||||
}
|
||||
|
||||
@Override
|
||||
public <E extends Event> void handleEvent(E event) {
|
||||
entity.handleEvent(event);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update(float dt) {
|
||||
entity.update(dt);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void render(Screen screen, Camera camera, ShaderManager shaderManager) {
|
||||
entity.render(screen, camera, shaderManager);
|
||||
}
|
||||
}
|
||||
@@ -3,17 +3,15 @@ package com.bartlomiejpluta.base.util.world;
|
||||
import com.bartlomiejpluta.base.api.camera.Camera;
|
||||
import com.bartlomiejpluta.base.api.character.Character;
|
||||
import com.bartlomiejpluta.base.api.context.Context;
|
||||
import com.bartlomiejpluta.base.api.context.ContextHolder;
|
||||
import com.bartlomiejpluta.base.api.event.Event;
|
||||
import com.bartlomiejpluta.base.api.event.EventType;
|
||||
import com.bartlomiejpluta.base.api.map.layer.object.ObjectLayer;
|
||||
import com.bartlomiejpluta.base.api.map.model.GameMap;
|
||||
import com.bartlomiejpluta.base.internal.logic.Updatable;
|
||||
import com.bartlomiejpluta.base.lib.entity.EntityDelegate;
|
||||
import com.bartlomiejpluta.base.util.math.Distance;
|
||||
import com.bartlomiejpluta.base.util.math.MathUtil;
|
||||
import com.bartlomiejpluta.base.util.random.DiceRoller;
|
||||
import lombok.NonNull;
|
||||
import org.joml.Vector2i;
|
||||
import org.joml.Vector2ic;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.LinkedList;
|
||||
@@ -22,16 +20,13 @@ import java.util.Random;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
|
||||
public class CharacterSpawner implements Updatable {
|
||||
public class CharacterSpawner extends EntityDelegate {
|
||||
private static final int MAX_REPOSITION_ATTEMPTS = 10;
|
||||
private final Random random = new Random();
|
||||
private final List<Character> spawnedEntities = new LinkedList<>();
|
||||
private final List<Supplier<Character>> spawners = new ArrayList<>();
|
||||
private final Vector2ic origin;
|
||||
private final Context context;
|
||||
private final Camera camera;
|
||||
private final GameMap map;
|
||||
private final ObjectLayer layer;
|
||||
private DiceRoller interval = DiceRoller.of("90d2");
|
||||
private int range = 4;
|
||||
private float spawnChance = 50;
|
||||
@@ -41,12 +36,10 @@ public class CharacterSpawner implements Updatable {
|
||||
private boolean spawnOutsideViewport = false;
|
||||
private float threshold;
|
||||
|
||||
public CharacterSpawner(int x, int y, @NonNull Context context, @NonNull GameMap map, @NonNull ObjectLayer layer) {
|
||||
this.origin = new Vector2i(x, y);
|
||||
this.context = context;
|
||||
public CharacterSpawner() {
|
||||
super(ContextHolder.INSTANCE.getContext().createAbstractEntity());
|
||||
this.context = ContextHolder.INSTANCE.getContext();
|
||||
this.camera = context.getCamera();
|
||||
this.map = map;
|
||||
this.layer = layer;
|
||||
drawThreshold();
|
||||
}
|
||||
|
||||
@@ -110,6 +103,9 @@ public class CharacterSpawner implements Updatable {
|
||||
return;
|
||||
}
|
||||
|
||||
var layer = getLayer();
|
||||
var map = layer.getMap();
|
||||
|
||||
// Spawn multiple entities at the time
|
||||
var roll = countRoller.roll();
|
||||
var count = Math.max(0, roll - spawnedEntities.size());
|
||||
@@ -124,8 +120,8 @@ public class CharacterSpawner implements Updatable {
|
||||
}
|
||||
|
||||
// Draw the coordinates and make sure they are inside the current map boundaries
|
||||
coordinates.x = MathUtil.clamp(origin.x() + random.nextInt(2 * range) - range, 0, map.getColumns() - 1);
|
||||
coordinates.y = MathUtil.clamp(origin.y() + random.nextInt(2 * range) - range, 0, map.getRows() - 1);
|
||||
coordinates.x = MathUtil.clamp(getCoordinates().x() + random.nextInt(2 * range) - range, 0, map.getColumns() - 1);
|
||||
coordinates.y = MathUtil.clamp(getCoordinates().y() + random.nextInt(2 * range) - range, 0, map.getRows() - 1);
|
||||
|
||||
// If tile is not reachable, draw the coordinates again
|
||||
if (!layer.isTileReachable(coordinates)) {
|
||||
@@ -142,7 +138,7 @@ public class CharacterSpawner implements Updatable {
|
||||
}
|
||||
|
||||
// We need also to drop the coordinates that are too far from the spawner origin
|
||||
if (Distance.manhattan(origin, coordinates) > range) {
|
||||
if (Distance.manhattan(getCoordinates(), coordinates) > range) {
|
||||
++attempts;
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@ import com.bartlomiejpluta.base.api.camera.Camera;
|
||||
import com.bartlomiejpluta.base.api.character.Character;
|
||||
import com.bartlomiejpluta.base.api.context.Context;
|
||||
import com.bartlomiejpluta.base.api.context.GamePauseEvent;
|
||||
import com.bartlomiejpluta.base.api.entity.Entity;
|
||||
import com.bartlomiejpluta.base.api.event.Event;
|
||||
import com.bartlomiejpluta.base.api.event.EventType;
|
||||
import com.bartlomiejpluta.base.api.gui.GUI;
|
||||
@@ -24,6 +25,7 @@ import com.bartlomiejpluta.base.engine.gui.render.NanoVGGUI;
|
||||
import com.bartlomiejpluta.base.engine.gui.xml.inflater.Inflater;
|
||||
import com.bartlomiejpluta.base.engine.world.animation.manager.AnimationManager;
|
||||
import com.bartlomiejpluta.base.engine.world.character.manager.CharacterManager;
|
||||
import com.bartlomiejpluta.base.engine.world.entity.AbstractEntity;
|
||||
import com.bartlomiejpluta.base.engine.world.icon.manager.IconManager;
|
||||
import com.bartlomiejpluta.base.engine.world.image.manager.ImageManager;
|
||||
import com.bartlomiejpluta.base.engine.world.map.manager.MapManager;
|
||||
@@ -160,6 +162,11 @@ public class DefaultContext implements Context {
|
||||
return animationManager.loadObject(animationUid);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Entity createAbstractEntity() {
|
||||
return new AbstractEntity();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Icon createIcon(@NonNull String iconSetUid, int row, int column) {
|
||||
return iconManager.createIcon(iconSetUid, row, column);
|
||||
|
||||
@@ -0,0 +1,52 @@
|
||||
package com.bartlomiejpluta.base.engine.world.entity;
|
||||
|
||||
import com.bartlomiejpluta.base.api.camera.Camera;
|
||||
import com.bartlomiejpluta.base.api.entity.Entity;
|
||||
import com.bartlomiejpluta.base.api.event.Event;
|
||||
import com.bartlomiejpluta.base.api.map.layer.object.ObjectLayer;
|
||||
import com.bartlomiejpluta.base.api.screen.Screen;
|
||||
import com.bartlomiejpluta.base.engine.world.location.LocationableModel;
|
||||
import com.bartlomiejpluta.base.internal.render.ShaderManager;
|
||||
import com.bartlomiejpluta.base.lib.event.EventHandler;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
public class AbstractEntity extends LocationableModel implements Entity {
|
||||
private final EventHandler eventHandler = new EventHandler();
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
private boolean blocking;
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
private int zIndex;
|
||||
|
||||
@Getter
|
||||
private ObjectLayer layer;
|
||||
|
||||
@Override
|
||||
public void onAdd(ObjectLayer layer) {
|
||||
this.layer = layer;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onRemove(ObjectLayer layer) {
|
||||
this.layer = null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public <E extends Event> void handleEvent(E event) {
|
||||
eventHandler.handleEvent(event);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update(float dt) {
|
||||
// noop
|
||||
}
|
||||
|
||||
@Override
|
||||
public void render(Screen screen, Camera camera, ShaderManager shaderManager) {
|
||||
// noop
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user