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.audio.Sound;
|
||||||
import com.bartlomiejpluta.base.api.camera.Camera;
|
import com.bartlomiejpluta.base.api.camera.Camera;
|
||||||
import com.bartlomiejpluta.base.api.character.Character;
|
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.Event;
|
||||||
import com.bartlomiejpluta.base.api.event.EventType;
|
import com.bartlomiejpluta.base.api.event.EventType;
|
||||||
import com.bartlomiejpluta.base.api.gui.GUI;
|
import com.bartlomiejpluta.base.api.gui.GUI;
|
||||||
@@ -44,6 +45,8 @@ public interface Context extends Updatable, Renderable, Disposable {
|
|||||||
|
|
||||||
Animation createAnimation(String animationUid);
|
Animation createAnimation(String animationUid);
|
||||||
|
|
||||||
|
Entity createAbstractEntity();
|
||||||
|
|
||||||
Icon createIcon(String iconSetUid, int row, int column);
|
Icon createIcon(String iconSetUid, int row, int column);
|
||||||
|
|
||||||
Image getImage(String imageUid);
|
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.camera.Camera;
|
||||||
import com.bartlomiejpluta.base.api.character.Character;
|
import com.bartlomiejpluta.base.api.character.Character;
|
||||||
import com.bartlomiejpluta.base.api.context.Context;
|
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.Event;
|
||||||
import com.bartlomiejpluta.base.api.event.EventType;
|
import com.bartlomiejpluta.base.api.event.EventType;
|
||||||
import com.bartlomiejpluta.base.api.map.layer.object.ObjectLayer;
|
import com.bartlomiejpluta.base.lib.entity.EntityDelegate;
|
||||||
import com.bartlomiejpluta.base.api.map.model.GameMap;
|
|
||||||
import com.bartlomiejpluta.base.internal.logic.Updatable;
|
|
||||||
import com.bartlomiejpluta.base.util.math.Distance;
|
import com.bartlomiejpluta.base.util.math.Distance;
|
||||||
import com.bartlomiejpluta.base.util.math.MathUtil;
|
import com.bartlomiejpluta.base.util.math.MathUtil;
|
||||||
import com.bartlomiejpluta.base.util.random.DiceRoller;
|
import com.bartlomiejpluta.base.util.random.DiceRoller;
|
||||||
import lombok.NonNull;
|
import lombok.NonNull;
|
||||||
import org.joml.Vector2i;
|
import org.joml.Vector2i;
|
||||||
import org.joml.Vector2ic;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
@@ -22,16 +20,13 @@ import java.util.Random;
|
|||||||
import java.util.function.Supplier;
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
|
|
||||||
public class CharacterSpawner implements Updatable {
|
public class CharacterSpawner extends EntityDelegate {
|
||||||
private static final int MAX_REPOSITION_ATTEMPTS = 10;
|
private static final int MAX_REPOSITION_ATTEMPTS = 10;
|
||||||
private final Random random = new Random();
|
private final Random random = new Random();
|
||||||
private final List<Character> spawnedEntities = new LinkedList<>();
|
private final List<Character> spawnedEntities = new LinkedList<>();
|
||||||
private final List<Supplier<Character>> spawners = new ArrayList<>();
|
private final List<Supplier<Character>> spawners = new ArrayList<>();
|
||||||
private final Vector2ic origin;
|
|
||||||
private final Context context;
|
private final Context context;
|
||||||
private final Camera camera;
|
private final Camera camera;
|
||||||
private final GameMap map;
|
|
||||||
private final ObjectLayer layer;
|
|
||||||
private DiceRoller interval = DiceRoller.of("90d2");
|
private DiceRoller interval = DiceRoller.of("90d2");
|
||||||
private int range = 4;
|
private int range = 4;
|
||||||
private float spawnChance = 50;
|
private float spawnChance = 50;
|
||||||
@@ -41,12 +36,10 @@ public class CharacterSpawner implements Updatable {
|
|||||||
private boolean spawnOutsideViewport = false;
|
private boolean spawnOutsideViewport = false;
|
||||||
private float threshold;
|
private float threshold;
|
||||||
|
|
||||||
public CharacterSpawner(int x, int y, @NonNull Context context, @NonNull GameMap map, @NonNull ObjectLayer layer) {
|
public CharacterSpawner() {
|
||||||
this.origin = new Vector2i(x, y);
|
super(ContextHolder.INSTANCE.getContext().createAbstractEntity());
|
||||||
this.context = context;
|
this.context = ContextHolder.INSTANCE.getContext();
|
||||||
this.camera = context.getCamera();
|
this.camera = context.getCamera();
|
||||||
this.map = map;
|
|
||||||
this.layer = layer;
|
|
||||||
drawThreshold();
|
drawThreshold();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -110,6 +103,9 @@ public class CharacterSpawner implements Updatable {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var layer = getLayer();
|
||||||
|
var map = layer.getMap();
|
||||||
|
|
||||||
// Spawn multiple entities at the time
|
// Spawn multiple entities at the time
|
||||||
var roll = countRoller.roll();
|
var roll = countRoller.roll();
|
||||||
var count = Math.max(0, roll - spawnedEntities.size());
|
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
|
// 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.x = MathUtil.clamp(getCoordinates().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.y = MathUtil.clamp(getCoordinates().y() + random.nextInt(2 * range) - range, 0, map.getRows() - 1);
|
||||||
|
|
||||||
// If tile is not reachable, draw the coordinates again
|
// If tile is not reachable, draw the coordinates again
|
||||||
if (!layer.isTileReachable(coordinates)) {
|
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
|
// 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;
|
++attempts;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import com.bartlomiejpluta.base.api.camera.Camera;
|
|||||||
import com.bartlomiejpluta.base.api.character.Character;
|
import com.bartlomiejpluta.base.api.character.Character;
|
||||||
import com.bartlomiejpluta.base.api.context.Context;
|
import com.bartlomiejpluta.base.api.context.Context;
|
||||||
import com.bartlomiejpluta.base.api.context.GamePauseEvent;
|
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.Event;
|
||||||
import com.bartlomiejpluta.base.api.event.EventType;
|
import com.bartlomiejpluta.base.api.event.EventType;
|
||||||
import com.bartlomiejpluta.base.api.gui.GUI;
|
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.gui.xml.inflater.Inflater;
|
||||||
import com.bartlomiejpluta.base.engine.world.animation.manager.AnimationManager;
|
import com.bartlomiejpluta.base.engine.world.animation.manager.AnimationManager;
|
||||||
import com.bartlomiejpluta.base.engine.world.character.manager.CharacterManager;
|
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.icon.manager.IconManager;
|
||||||
import com.bartlomiejpluta.base.engine.world.image.manager.ImageManager;
|
import com.bartlomiejpluta.base.engine.world.image.manager.ImageManager;
|
||||||
import com.bartlomiejpluta.base.engine.world.map.manager.MapManager;
|
import com.bartlomiejpluta.base.engine.world.map.manager.MapManager;
|
||||||
@@ -160,6 +162,11 @@ public class DefaultContext implements Context {
|
|||||||
return animationManager.loadObject(animationUid);
|
return animationManager.loadObject(animationUid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Entity createAbstractEntity() {
|
||||||
|
return new AbstractEntity();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Icon createIcon(@NonNull String iconSetUid, int row, int column) {
|
public Icon createIcon(@NonNull String iconSetUid, int row, int column) {
|
||||||
return iconManager.createIcon(iconSetUid, row, 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