From 4f9a598d1379ccfb9940877b40294d889a34197a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Przemys=C5=82aw=20Pluta?= Date: Wed, 31 Mar 2021 21:35:43 +0200 Subject: [PATCH] Create InteractiveEntity --- .../base/api/entity/InteractiveEntity.java | 9 ++ .../api/map/layer/object/ObjectLayer.java | 5 ++ .../base/api/move/AnimationMovement.java | 40 +++++++++ .../base/api/move/EntityMovement.java | 45 ++++++++++ .../base/api/move/Movement.java | 34 ++----- .../base/lib/animation/AnimationDelegate.java | 3 +- .../base/lib/entity/EntityDelegate.java | 3 +- .../animation/model/DefaultAnimation.java | 8 ++ .../world/entity/model/DefaultEntity.java | 6 ++ .../map/layer/object/DefaultObjectLayer.java | 90 +++++++++++++------ .../engine/world/movement/MovableSprite.java | 9 +- 11 files changed, 189 insertions(+), 63 deletions(-) create mode 100644 api/src/main/java/com/bartlomiejpluta/base/api/entity/InteractiveEntity.java create mode 100644 api/src/main/java/com/bartlomiejpluta/base/api/move/AnimationMovement.java create mode 100644 api/src/main/java/com/bartlomiejpluta/base/api/move/EntityMovement.java diff --git a/api/src/main/java/com/bartlomiejpluta/base/api/entity/InteractiveEntity.java b/api/src/main/java/com/bartlomiejpluta/base/api/entity/InteractiveEntity.java new file mode 100644 index 00000000..a7816d55 --- /dev/null +++ b/api/src/main/java/com/bartlomiejpluta/base/api/entity/InteractiveEntity.java @@ -0,0 +1,9 @@ +package com.bartlomiejpluta.base.api.entity; + +import com.bartlomiejpluta.base.api.move.Movement; + +public interface InteractiveEntity extends Entity { + void onEntityStepIn(Movement movement, Entity entity); + + void onEntityStepOut(Movement movement, Entity entity); +} diff --git a/api/src/main/java/com/bartlomiejpluta/base/api/map/layer/object/ObjectLayer.java b/api/src/main/java/com/bartlomiejpluta/base/api/map/layer/object/ObjectLayer.java index 3d190c2d..8b048c80 100644 --- a/api/src/main/java/com/bartlomiejpluta/base/api/map/layer/object/ObjectLayer.java +++ b/api/src/main/java/com/bartlomiejpluta/base/api/map/layer/object/ObjectLayer.java @@ -30,4 +30,9 @@ public interface ObjectLayer extends Layer { boolean isTileReachable(Vector2ic tileCoordinates); void pushMovement(Movement movement); + + // Notifiers + void notifyEntityStepIn(Movement movement, Entity entity); + + void notifyEntityStepOut(Movement movement, Entity entity); } diff --git a/api/src/main/java/com/bartlomiejpluta/base/api/move/AnimationMovement.java b/api/src/main/java/com/bartlomiejpluta/base/api/move/AnimationMovement.java new file mode 100644 index 00000000..af9003ed --- /dev/null +++ b/api/src/main/java/com/bartlomiejpluta/base/api/move/AnimationMovement.java @@ -0,0 +1,40 @@ +package com.bartlomiejpluta.base.api.move; + +import com.bartlomiejpluta.base.api.animation.Animation; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.NonNull; +import org.joml.Vector2i; +import org.joml.Vector2ic; + +@Getter +@EqualsAndHashCode +public final class AnimationMovement implements Movement { + private final Animation object; + private final Direction direction; + private final Vector2ic from; + private final Vector2ic to; + + public AnimationMovement(@NonNull Animation object, @NonNull Direction direction) { + this.object = object; + this.direction = direction; + + this.from = object.getCoordinates(); + this.to = direction.vector.add(object.getCoordinates(), new Vector2i()); + } + + @Override + public boolean perform() { + return object.move(this); + } + + @Override + public void abort() { + object.abortMove(); + } + + @Override + public void onFinish() { + // do nothing + } +} diff --git a/api/src/main/java/com/bartlomiejpluta/base/api/move/EntityMovement.java b/api/src/main/java/com/bartlomiejpluta/base/api/move/EntityMovement.java new file mode 100644 index 00000000..c9aab208 --- /dev/null +++ b/api/src/main/java/com/bartlomiejpluta/base/api/move/EntityMovement.java @@ -0,0 +1,45 @@ +package com.bartlomiejpluta.base.api.move; + +import com.bartlomiejpluta.base.api.entity.Entity; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.NonNull; +import org.joml.Vector2i; +import org.joml.Vector2ic; + +@Getter +@EqualsAndHashCode +public final class EntityMovement implements Movement { + private final Entity object; + private final Direction direction; + private final Vector2ic from; + private final Vector2ic to; + + public EntityMovement(@NonNull Entity object, @NonNull Direction direction) { + this.object = object; + this.direction = direction; + + this.from = object.getCoordinates(); + this.to = direction.vector.add(object.getCoordinates(), new Vector2i()); + } + + @Override + public boolean perform() { + var result = object.move(this); + if (result) { + object.getLayer().notifyEntityStepOut(this, object); + } + + return result; + } + + @Override + public void abort() { + object.abortMove(); + } + + @Override + public void onFinish() { + object.getLayer().notifyEntityStepIn(this, object); + } +} diff --git a/api/src/main/java/com/bartlomiejpluta/base/api/move/Movement.java b/api/src/main/java/com/bartlomiejpluta/base/api/move/Movement.java index 42117f16..d7b73903 100644 --- a/api/src/main/java/com/bartlomiejpluta/base/api/move/Movement.java +++ b/api/src/main/java/com/bartlomiejpluta/base/api/move/Movement.java @@ -1,36 +1,18 @@ package com.bartlomiejpluta.base.api.move; -import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.NonNull; -import org.joml.Vector2i; import org.joml.Vector2ic; -@Getter -@EqualsAndHashCode -public final class Movement { - private final Movable object; - private final Direction direction; - private final Vector2ic from; - private final Vector2ic to; +public interface Movement { - public Movement(@NonNull Movable object, @NonNull Direction direction) { - this.object = object; - this.direction = direction; + Vector2ic getFrom(); - this.from = object.getCoordinates(); - this.to = direction.vector.add(object.getCoordinates(), new Vector2i()); - } + Vector2ic getTo(); - public boolean perform() { - return object.move(this); - } + Direction getDirection(); - public void abort() { - object.abortMove(); - } + boolean perform(); - public Movement another() { - return object.prepareMovement(direction); - } + void abort(); + + void onFinish(); } diff --git a/api/src/main/java/com/bartlomiejpluta/base/lib/animation/AnimationDelegate.java b/api/src/main/java/com/bartlomiejpluta/base/lib/animation/AnimationDelegate.java index 9b38fe31..19509976 100644 --- a/api/src/main/java/com/bartlomiejpluta/base/lib/animation/AnimationDelegate.java +++ b/api/src/main/java/com/bartlomiejpluta/base/lib/animation/AnimationDelegate.java @@ -3,6 +3,7 @@ package com.bartlomiejpluta.base.lib.animation; import com.bartlomiejpluta.base.api.animation.Animation; import com.bartlomiejpluta.base.api.camera.Camera; import com.bartlomiejpluta.base.api.map.layer.base.Layer; +import com.bartlomiejpluta.base.api.move.AnimationMovement; import com.bartlomiejpluta.base.api.move.Direction; import com.bartlomiejpluta.base.api.move.Movement; import com.bartlomiejpluta.base.api.screen.Screen; @@ -147,7 +148,7 @@ public abstract class AnimationDelegate implements Animation { @Override public Movement prepareMovement(Direction direction) { - return new Movement(this, direction); + return new AnimationMovement(this, direction); } @Override diff --git a/api/src/main/java/com/bartlomiejpluta/base/lib/entity/EntityDelegate.java b/api/src/main/java/com/bartlomiejpluta/base/lib/entity/EntityDelegate.java index b4ddcb26..314f8794 100644 --- a/api/src/main/java/com/bartlomiejpluta/base/lib/entity/EntityDelegate.java +++ b/api/src/main/java/com/bartlomiejpluta/base/lib/entity/EntityDelegate.java @@ -4,6 +4,7 @@ import com.bartlomiejpluta.base.api.camera.Camera; import com.bartlomiejpluta.base.api.entity.Entity; import com.bartlomiejpluta.base.api.map.layer.object.ObjectLayer; import com.bartlomiejpluta.base.api.move.Direction; +import com.bartlomiejpluta.base.api.move.EntityMovement; import com.bartlomiejpluta.base.api.move.Movement; import com.bartlomiejpluta.base.api.screen.Screen; import com.bartlomiejpluta.base.internal.object.Placeable; @@ -41,7 +42,7 @@ public abstract class EntityDelegate implements Entity { @Override public Movement prepareMovement(Direction direction) { - return new Movement(this, direction); + return new EntityMovement(this, direction); } @Override diff --git a/engine/src/main/java/com/bartlomiejpluta/base/engine/world/animation/model/DefaultAnimation.java b/engine/src/main/java/com/bartlomiejpluta/base/engine/world/animation/model/DefaultAnimation.java index 851f1953..9142bbe7 100644 --- a/engine/src/main/java/com/bartlomiejpluta/base/engine/world/animation/model/DefaultAnimation.java +++ b/engine/src/main/java/com/bartlomiejpluta/base/engine/world/animation/model/DefaultAnimation.java @@ -3,6 +3,9 @@ package com.bartlomiejpluta.base.engine.world.animation.model; import com.bartlomiejpluta.base.api.animation.Animation; import com.bartlomiejpluta.base.api.map.layer.base.Layer; import com.bartlomiejpluta.base.api.map.layer.object.ObjectLayer; +import com.bartlomiejpluta.base.api.move.AnimationMovement; +import com.bartlomiejpluta.base.api.move.Direction; +import com.bartlomiejpluta.base.api.move.Movement; import com.bartlomiejpluta.base.engine.core.gl.object.material.Material; import com.bartlomiejpluta.base.engine.core.gl.object.mesh.Mesh; import com.bartlomiejpluta.base.engine.world.movement.MovableSprite; @@ -94,6 +97,11 @@ public class DefaultAnimation extends MovableSprite implements Animation { } } + @Override + public Movement prepareMovement(Direction direction) { + return new AnimationMovement(this, direction); + } + @Override public void onAdd(Layer layer) { this.layer = layer; diff --git a/engine/src/main/java/com/bartlomiejpluta/base/engine/world/entity/model/DefaultEntity.java b/engine/src/main/java/com/bartlomiejpluta/base/engine/world/entity/model/DefaultEntity.java index de58e4d5..3e51c581 100644 --- a/engine/src/main/java/com/bartlomiejpluta/base/engine/world/entity/model/DefaultEntity.java +++ b/engine/src/main/java/com/bartlomiejpluta/base/engine/world/entity/model/DefaultEntity.java @@ -3,6 +3,7 @@ package com.bartlomiejpluta.base.engine.world.entity.model; import com.bartlomiejpluta.base.api.entity.Entity; import com.bartlomiejpluta.base.api.map.layer.object.ObjectLayer; import com.bartlomiejpluta.base.api.move.Direction; +import com.bartlomiejpluta.base.api.move.EntityMovement; import com.bartlomiejpluta.base.api.move.Movement; import com.bartlomiejpluta.base.engine.core.gl.object.mesh.Mesh; import com.bartlomiejpluta.base.engine.world.entity.manager.EntitySetManager; @@ -89,6 +90,11 @@ public class DefaultEntity extends MovableSprite implements Entity { material.setSpritePosition(spriteDefaultRows.get(faceDirection)); } + @Override + public Movement prepareMovement(Direction direction) { + return new EntityMovement(this, direction); + } + @Override public boolean move(Movement movement) { if (super.move(movement)) { diff --git a/engine/src/main/java/com/bartlomiejpluta/base/engine/world/map/layer/object/DefaultObjectLayer.java b/engine/src/main/java/com/bartlomiejpluta/base/engine/world/map/layer/object/DefaultObjectLayer.java index d67a7e70..e9c872a5 100644 --- a/engine/src/main/java/com/bartlomiejpluta/base/engine/world/map/layer/object/DefaultObjectLayer.java +++ b/engine/src/main/java/com/bartlomiejpluta/base/engine/world/map/layer/object/DefaultObjectLayer.java @@ -3,6 +3,7 @@ package com.bartlomiejpluta.base.engine.world.map.layer.object; import com.bartlomiejpluta.base.api.ai.NPC; import com.bartlomiejpluta.base.api.camera.Camera; import com.bartlomiejpluta.base.api.entity.Entity; +import com.bartlomiejpluta.base.api.entity.InteractiveEntity; import com.bartlomiejpluta.base.api.map.layer.object.ObjectLayer; import com.bartlomiejpluta.base.api.map.layer.object.PassageAbility; import com.bartlomiejpluta.base.api.map.model.GameMap; @@ -28,6 +29,8 @@ public class DefaultObjectLayer extends BaseLayer implements ObjectLayer { @Getter private final List entities; + private final List interactiveEntities = new ArrayList<>(); + @Getter private final PassageAbility[][] passageMap; @@ -131,35 +134,14 @@ public class DefaultObjectLayer extends BaseLayer implements ObjectLayer { @Override public void update(float dt) { - super.update(dt); - - while (!movements.isEmpty()) { - var movement = movements.poll(); - var from = movement.getFrom(); - var to = movement.getTo(); - if (isTileReachable(to)) { - movement.perform(); - - for(var rule : movementRules) { - if(((from.equals(rule.from())) || (to.equals(rule.to())))) { - rule.invoke(movement); - } - } - } - } - - for (var entity : entities) { - entity.update(dt); - - if (entity instanceof NPC) { - ((NPC) entity).getStrategy().nextActivity(this, dt); - } - } - // Insert entities requested to be added - if(!entitiesToAdd.isEmpty()) { + if (!entitiesToAdd.isEmpty()) { for (var entity : entitiesToAdd) { entity.onAdd(this); + if (entity instanceof InteractiveEntity) { + interactiveEntities.add((InteractiveEntity) entity); + } + entities.add(entity); } @@ -167,7 +149,7 @@ public class DefaultObjectLayer extends BaseLayer implements ObjectLayer { } // Insert rules requested to be added - if(!movementRulesToAdd.isEmpty()) { + if (!movementRulesToAdd.isEmpty()) { movementRules.addAll(movementRulesToAdd); movementRulesToAdd.clear(); } @@ -176,6 +158,10 @@ public class DefaultObjectLayer extends BaseLayer implements ObjectLayer { if (!entitiesToRemove.isEmpty()) { for (var entity : entitiesToRemove) { entities.remove(entity); + if (entity instanceof InteractiveEntity) { + interactiveEntities.remove(entity); + } + entity.onRemove(this); } @@ -187,6 +173,34 @@ public class DefaultObjectLayer extends BaseLayer implements ObjectLayer { movementRules.removeAll(movementRulesToRemove); movementRulesToRemove.clear(); } + + // Update BaseLayer (animations etc.) + super.update(dt); + + // Update movements + while (!movements.isEmpty()) { + var movement = movements.poll(); + var from = movement.getFrom(); + var to = movement.getTo(); + if (isTileReachable(to)) { + movement.perform(); + + for (var rule : movementRules) { + if (((from.equals(rule.from())) || (to.equals(rule.to())))) { + rule.invoke(movement); + } + } + } + } + + // Update entities + for (var entity : entities) { + entity.update(dt); + + if (entity instanceof NPC) { + ((NPC) entity).getStrategy().nextActivity(this, dt); + } + } } @Override @@ -204,4 +218,26 @@ public class DefaultObjectLayer extends BaseLayer implements ObjectLayer { var z = compare(a.getZIndex(), b.getZIndex()); return z == 0 ? compare(a.getPosition().y(), b.getPosition().y()) : z; } + + @Override + public void notifyEntityStepIn(Movement movement, Entity entity) { + var target = movement.getTo(); + + for (var listener : interactiveEntities) { + if (listener.getCoordinates().equals(target)) { + listener.onEntityStepIn(movement, entity); + } + } + } + + @Override + public void notifyEntityStepOut(Movement movement, Entity entity) { + var source = movement.getFrom(); + + for (var listener : interactiveEntities) { + if (listener.getCoordinates().equals(source)) { + listener.onEntityStepOut(movement, entity); + } + } + } } diff --git a/engine/src/main/java/com/bartlomiejpluta/base/engine/world/movement/MovableSprite.java b/engine/src/main/java/com/bartlomiejpluta/base/engine/world/movement/MovableSprite.java index bac94821..c83ae975 100644 --- a/engine/src/main/java/com/bartlomiejpluta/base/engine/world/movement/MovableSprite.java +++ b/engine/src/main/java/com/bartlomiejpluta/base/engine/world/movement/MovableSprite.java @@ -1,6 +1,5 @@ package com.bartlomiejpluta.base.engine.world.movement; -import com.bartlomiejpluta.base.api.move.Direction; import com.bartlomiejpluta.base.api.move.Movable; import com.bartlomiejpluta.base.api.move.Movement; import com.bartlomiejpluta.base.engine.core.gl.object.material.Material; @@ -30,8 +29,6 @@ public abstract class MovableSprite extends AnimatedSprite implements Movable, U private enum PlacingMode {BY_POSITION, BY_COORDINATES} - ; - private PlacingMode placingMode; @Getter @@ -68,6 +65,7 @@ public abstract class MovableSprite extends AnimatedSprite implements Movable, U } else { adjustCoordinates(); setDefaultAnimationFrame(); + movement.onFinish(); movementVector = null; movement = null; } @@ -80,11 +78,6 @@ public abstract class MovableSprite extends AnimatedSprite implements Movable, U setCoordinates(movement.getTo()); } - @Override - public Movement prepareMovement(Direction direction) { - return new Movement(this, direction); - } - @Override public boolean move(Movement movement) { if (this.movement != null) {