Improve other entities collision detection
This commit is contained in:
@@ -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.Entity;
|
||||
import com.bartlomiejpluta.base.api.game.entity.Movement;
|
||||
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.mesh.Mesh;
|
||||
@@ -59,9 +60,9 @@ public class DefaultEntity extends MovableSprite implements Entity {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean move(Direction direction) {
|
||||
if (super.move(direction)) {
|
||||
faceDirection = direction;
|
||||
protected boolean move(Movement movement) {
|
||||
if (super.move(movement)) {
|
||||
faceDirection = movement.getDirection();
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -110,8 +110,18 @@ public class DefaultObjectLayer implements ObjectLayer {
|
||||
};
|
||||
|
||||
for (var entity : entities) {
|
||||
if (entity.isBlocking() && entity.getCoordinates().equals(target)) {
|
||||
return false;
|
||||
if (entity.isBlocking()) {
|
||||
|
||||
// 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
|
||||
public void update(float dt) {
|
||||
for (var iterator = movements.iterator(); iterator.hasNext(); ) {
|
||||
iterator.next().perform(this);
|
||||
var movement = iterator.next();
|
||||
|
||||
if (isMovementPossible(movement)) {
|
||||
movement.perform();
|
||||
}
|
||||
|
||||
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.Movement;
|
||||
import com.bartlomiejpluta.base.api.game.map.layer.object.ObjectLayer;
|
||||
import lombok.AccessLevel;
|
||||
import lombok.Data;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.joml.Vector2i;
|
||||
|
||||
@Data
|
||||
@RequiredArgsConstructor(access = AccessLevel.PACKAGE)
|
||||
public class DefaultMovement implements Movement {
|
||||
private final MovableSprite object;
|
||||
private final Direction direction;
|
||||
private final Vector2i from;
|
||||
private final Vector2i to;
|
||||
private boolean performed = false;
|
||||
|
||||
@Override
|
||||
public boolean perform(ObjectLayer layer) {
|
||||
if (!layer.isMovementPossible(this)) {
|
||||
return false;
|
||||
}
|
||||
DefaultMovement(MovableSprite object, Direction direction) {
|
||||
this.object = object;
|
||||
this.direction = direction;
|
||||
|
||||
return object.move(direction);
|
||||
this.from = object.getCoordinates();
|
||||
this.to = direction.asVector().add(object.getCoordinates());
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean perform() {
|
||||
return object.move(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -31,11 +33,11 @@ public class DefaultMovement implements Movement {
|
||||
|
||||
@Override
|
||||
public Vector2i getFrom() {
|
||||
return object.getCoordinates();
|
||||
return from;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Vector2i getTo() {
|
||||
return direction.asVector().add(object.getCoordinates());
|
||||
return to;
|
||||
}
|
||||
}
|
||||
@@ -24,15 +24,18 @@ public abstract class MovableSprite extends AnimatedSprite implements Updatable
|
||||
@Getter
|
||||
private final Vector2i coordinates = new Vector2i(0, 0);
|
||||
|
||||
@Getter
|
||||
private Movement movement;
|
||||
|
||||
protected int framesToCrossOneTile = 1;
|
||||
|
||||
public boolean isMoving() {
|
||||
return movementVector != null;
|
||||
return movement != null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update(float dt) {
|
||||
if (movementVector != null) {
|
||||
if (movement != null) {
|
||||
if (moveTime > 0) {
|
||||
--moveTime;
|
||||
movePosition(movementVector);
|
||||
@@ -40,6 +43,7 @@ public abstract class MovableSprite extends AnimatedSprite implements Updatable
|
||||
adjustCoordinates();
|
||||
setDefaultAnimationFrame();
|
||||
movementVector = null;
|
||||
movement = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -47,21 +51,25 @@ public abstract class MovableSprite extends AnimatedSprite implements Updatable
|
||||
protected abstract void setDefaultAnimationFrame();
|
||||
|
||||
private void adjustCoordinates() {
|
||||
var position = new Vector2f(getPosition());
|
||||
setCoordinates(new Vector2i((int) (position.x / coordinateStepSize.x), (int) (position.y / coordinateStepSize.y)));
|
||||
setCoordinates(movement.getTo());
|
||||
}
|
||||
|
||||
public Movement prepareMovement(Direction direction) {
|
||||
return new DefaultMovement(this, direction);
|
||||
}
|
||||
|
||||
protected boolean move(Direction direction) {
|
||||
if (this.movementVector != null) {
|
||||
protected boolean move(Movement movement) {
|
||||
if (this.movement != null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!movement.getFrom().equals(coordinates)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
this.movement = movement;
|
||||
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;
|
||||
|
||||
return true;
|
||||
|
||||
Reference in New Issue
Block a user