Improve other entities collision detection
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -110,8 +110,18 @@ public class DefaultObjectLayer implements ObjectLayer {
|
|||||||
};
|
};
|
||||||
|
|
||||||
for (var entity : entities) {
|
for (var entity : entities) {
|
||||||
if (entity.isBlocking() && entity.getCoordinates().equals(target)) {
|
if (entity.isBlocking()) {
|
||||||
return false;
|
|
||||||
|
// The tile is occupied by other entity
|
||||||
|
if (entity.getCoordinates().equals(target)) {
|
||||||
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
|
||||||
}
|
|
||||||
|
|
||||||
return object.move(direction);
|
this.from = object.getCoordinates();
|
||||||
|
this.to = direction.asVector().add(object.getCoordinates());
|
||||||
|
}
|
||||||
|
|
||||||
|
@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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user