Create AbstractEntity class

This commit is contained in:
2022-08-23 19:44:18 +02:00
parent 1715b75eab
commit 38d7baaef1
5 changed files with 286 additions and 16 deletions

View File

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

View File

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

View File

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

View File

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

View File

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