Improve other entities collision detection

This commit is contained in:
2021-03-06 09:26:40 +01:00
parent 4e54db4952
commit 61dc5f89b4
7 changed files with 59 additions and 27 deletions

View File

@@ -17,6 +17,8 @@ public interface Entity extends Placeable, Renderable, Updatable {
Movement prepareMovement(Direction direction); Movement prepareMovement(Direction direction);
Movement getMovement();
Direction getFaceDirection(); Direction getFaceDirection();
void setFaceDirection(Direction direction); void setFaceDirection(Direction direction);

View File

@@ -41,6 +41,11 @@ public abstract class EntityDelegate implements Entity {
return entity.prepareMovement(direction); return entity.prepareMovement(direction);
} }
@Override
public Movement getMovement() {
return entity.getMovement();
}
@Override @Override
public Direction getFaceDirection() { public Direction getFaceDirection() {
return entity.getFaceDirection(); return entity.getFaceDirection();

View File

@@ -1,11 +1,10 @@
package com.bartlomiejpluta.base.api.game.entity; package com.bartlomiejpluta.base.api.game.entity;
import com.bartlomiejpluta.base.api.game.map.layer.object.ObjectLayer;
import org.joml.Vector2i; import org.joml.Vector2i;
public interface Movement { public interface Movement {
boolean perform(ObjectLayer layer); boolean perform();
Movement another(); Movement another();

View File

@@ -2,6 +2,7 @@ package com.bartlomiejpluta.base.engine.world.entity.model;
import com.bartlomiejpluta.base.api.game.entity.Direction; import com.bartlomiejpluta.base.api.game.entity.Direction;
import com.bartlomiejpluta.base.api.game.entity.Entity; import com.bartlomiejpluta.base.api.game.entity.Entity;
import com.bartlomiejpluta.base.api.game.entity.Movement;
import com.bartlomiejpluta.base.api.game.map.layer.object.ObjectLayer; import com.bartlomiejpluta.base.api.game.map.layer.object.ObjectLayer;
import com.bartlomiejpluta.base.engine.core.gl.object.material.Material; 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.core.gl.object.mesh.Mesh;
@@ -59,9 +60,9 @@ public class DefaultEntity extends MovableSprite implements Entity {
} }
@Override @Override
protected boolean move(Direction direction) { protected boolean move(Movement movement) {
if (super.move(direction)) { if (super.move(movement)) {
faceDirection = direction; faceDirection = movement.getDirection();
return true; return true;
} }

View File

@@ -110,9 +110,19 @@ public class DefaultObjectLayer implements ObjectLayer {
}; };
for (var entity : entities) { for (var entity : entities) {
if (entity.isBlocking() && entity.getCoordinates().equals(target)) { if (entity.isBlocking()) {
// The tile is occupied by other entity
if (entity.getCoordinates().equals(target)) {
return false; return false;
} }
// The tile is empty, however another entity is moving on it
var otherMovement = entity.getMovement();
if (otherMovement != null && otherMovement.getTo().equals(target)) {
return false;
}
}
} }
return isTargetReachable && canMoveFromCurrentTile; return isTargetReachable && canMoveFromCurrentTile;
@@ -126,7 +136,12 @@ public class DefaultObjectLayer implements ObjectLayer {
@Override @Override
public void update(float dt) { public void update(float dt) {
for (var iterator = movements.iterator(); iterator.hasNext(); ) { for (var iterator = movements.iterator(); iterator.hasNext(); ) {
iterator.next().perform(this); var movement = iterator.next();
if (isMovementPossible(movement)) {
movement.perform();
}
iterator.remove(); iterator.remove();
} }

View File

@@ -2,26 +2,28 @@ package com.bartlomiejpluta.base.engine.world.movement;
import com.bartlomiejpluta.base.api.game.entity.Direction; import com.bartlomiejpluta.base.api.game.entity.Direction;
import com.bartlomiejpluta.base.api.game.entity.Movement; import com.bartlomiejpluta.base.api.game.entity.Movement;
import com.bartlomiejpluta.base.api.game.map.layer.object.ObjectLayer;
import lombok.AccessLevel;
import lombok.Data; import lombok.Data;
import lombok.RequiredArgsConstructor;
import org.joml.Vector2i; import org.joml.Vector2i;
@Data @Data
@RequiredArgsConstructor(access = AccessLevel.PACKAGE)
public class DefaultMovement implements Movement { public class DefaultMovement implements Movement {
private final MovableSprite object; private final MovableSprite object;
private final Direction direction; private final Direction direction;
private final Vector2i from;
private final Vector2i to;
private boolean performed = false; private boolean performed = false;
@Override DefaultMovement(MovableSprite object, Direction direction) {
public boolean perform(ObjectLayer layer) { this.object = object;
if (!layer.isMovementPossible(this)) { this.direction = direction;
return false;
this.from = object.getCoordinates();
this.to = direction.asVector().add(object.getCoordinates());
} }
return object.move(direction); @Override
public boolean perform() {
return object.move(this);
} }
@Override @Override
@@ -31,11 +33,11 @@ public class DefaultMovement implements Movement {
@Override @Override
public Vector2i getFrom() { public Vector2i getFrom() {
return object.getCoordinates(); return from;
} }
@Override @Override
public Vector2i getTo() { public Vector2i getTo() {
return direction.asVector().add(object.getCoordinates()); return to;
} }
} }

View File

@@ -24,15 +24,18 @@ public abstract class MovableSprite extends AnimatedSprite implements Updatable
@Getter @Getter
private final Vector2i coordinates = new Vector2i(0, 0); private final Vector2i coordinates = new Vector2i(0, 0);
@Getter
private Movement movement;
protected int framesToCrossOneTile = 1; protected int framesToCrossOneTile = 1;
public boolean isMoving() { public boolean isMoving() {
return movementVector != null; return movement != null;
} }
@Override @Override
public void update(float dt) { public void update(float dt) {
if (movementVector != null) { if (movement != null) {
if (moveTime > 0) { if (moveTime > 0) {
--moveTime; --moveTime;
movePosition(movementVector); movePosition(movementVector);
@@ -40,6 +43,7 @@ public abstract class MovableSprite extends AnimatedSprite implements Updatable
adjustCoordinates(); adjustCoordinates();
setDefaultAnimationFrame(); setDefaultAnimationFrame();
movementVector = null; movementVector = null;
movement = null;
} }
} }
} }
@@ -47,21 +51,25 @@ public abstract class MovableSprite extends AnimatedSprite implements Updatable
protected abstract void setDefaultAnimationFrame(); protected abstract void setDefaultAnimationFrame();
private void adjustCoordinates() { private void adjustCoordinates() {
var position = new Vector2f(getPosition()); setCoordinates(movement.getTo());
setCoordinates(new Vector2i((int) (position.x / coordinateStepSize.x), (int) (position.y / coordinateStepSize.y)));
} }
public Movement prepareMovement(Direction direction) { public Movement prepareMovement(Direction direction) {
return new DefaultMovement(this, direction); return new DefaultMovement(this, direction);
} }
protected boolean move(Direction direction) { protected boolean move(Movement movement) {
if (this.movementVector != null) { if (this.movement != null) {
return false; return false;
} }
if (!movement.getFrom().equals(coordinates)) {
return false;
}
this.movement = movement;
var speed = new Vector2f(coordinateStepSize).div(framesToCrossOneTile); var speed = new Vector2f(coordinateStepSize).div(framesToCrossOneTile);
movementVector = new Vector2f(direction.x, direction.y).mul(speed); movementVector = new Vector2f(movement.getDirection().x, movement.getDirection().y).mul(speed);
moveTime = framesToCrossOneTile; moveTime = framesToCrossOneTile;
return true; return true;