Fixed bugs with moving Obstacles

This commit is contained in:
=
2018-01-06 16:39:17 +01:00
parent aec77b5114
commit 77b927cb1a
7 changed files with 582 additions and 766 deletions

View File

@ -39,10 +39,10 @@ public class Obstacle extends Entity {
gridSize = calcGridSize();
}
public boolean isMovePathInSightDistance(Camera camera) {
public boolean isPlayerOverTrigger(Player player) {
if (moveComponent == null)
return false;
return moveComponent.getLeftmostPosition() - super.getWidth() / 2 <= camera.getX() + 2;
return moveComponent.getLeftmostPosition() - super.getWidth() / 2 - moveComponent.getTriggerDistance() <= player.getRightEdge();
}
private Vector calcGridSize() {
@ -67,7 +67,12 @@ public class Obstacle extends Entity {
moveProgress = 2 - moveProgress;
moveDirection *= -1;
}
Vector oldPosition = new Vector(super.getPosition());
super.setPosition(moveComponent.getPositionForProgress(moveProgress));
Vector newPosition = new Vector(super.getPosition());
Vector move = newPosition.translate(oldPosition.negate());
move.mul(1 / frameTime);
super.setMovement(move);
}
public boolean isMoving() {

View File

@ -147,7 +147,7 @@ public class CollisionDetector {
}
private Edge circleQuadCollisionEdge(Circle circle, Vector circleMovement, Quad quad, Vector quadMovement) {
Vector relativeMovement = circleMovement.translate(quadMovement);
Vector relativeMovement = circleMovement.translate(quadMovement.negate());
//LEFT || TOP || BOTTOM
if (relativeMovement.x > 0) {
@ -156,7 +156,7 @@ public class CollisionDetector {
float toLeftDistance = quad.getLeftEdge() - circle.getCenter().x - circle.getRadius();
float actualY = toLeftDistance * (relativeMovement.y / relativeMovement.x) + circle
.getCenter().y + circle.getRadius();
if (actualY < quad.getBottomEdge())
if (actualY <= quad.getBottomEdge())
return Edge.BOTTOM;
else
return Edge.LEFT;
@ -166,10 +166,10 @@ public class CollisionDetector {
float toLeftDistance = quad.getLeftEdge() - circle.getCenter().x - circle.getRadius();
float actualY = toLeftDistance * (relativeMovement.y / relativeMovement.x) + circle
.getCenter().y - circle.getRadius();
if (actualY < quad.getTopEdge())
return Edge.LEFT;
else
if (actualY > quad.getTopEdge())
return Edge.TOP;
else
return Edge.LEFT;
} else {
return Edge.LEFT;
}
@ -181,7 +181,7 @@ public class CollisionDetector {
float toRightDistance = quad.getRightEdge() - circle.getCenter().x + circle.getRadius();
float actualY = toRightDistance * (relativeMovement.y / relativeMovement.x) + circle
.getCenter().y + circle.getRadius();
if (actualY < quad.getBottomEdge())
if (actualY <= quad.getBottomEdge())
return Edge.BOTTOM;
else
return Edge.RIGHT;
@ -191,10 +191,10 @@ public class CollisionDetector {
float toRightDistance = quad.getRightEdge() - circle.getCenter().x + circle.getRadius();
float actualY = toRightDistance * (relativeMovement.y / relativeMovement.x) + circle
.getCenter().y - circle.getRadius();
if (actualY < quad.getTopEdge())
return Edge.RIGHT;
else
if (actualY > quad.getTopEdge())
return Edge.TOP;
else
return Edge.RIGHT;
} else {
return Edge.RIGHT;
}

View File

@ -19,6 +19,8 @@ public class MoveComponent {
private float speed;
@Attribute
private boolean hasPlayerXSpeed;
@Attribute
private float triggerDistance;
public final float TRANSITION_VALUE = 0.001f;
private Vector position;
@ -63,6 +65,10 @@ public class MoveComponent {
return hasPlayerXSpeed;
}
public float getTriggerDistance() {
return triggerDistance;
}
public void calcSpeedForPlayerSpeed(Player player) {
float xSpeed = player.getSpeed();
double invertRotationRadians = Math.toRadians(90 - getRotation());

View File

@ -8,10 +8,10 @@ import java.util.List;
import de.frajul.endlessroll.data.Vector;
import de.frajul.endlessroll.entities.AnimatedEntity;
import de.frajul.endlessroll.entities.Background;
import de.frajul.endlessroll.entities.collectables.Collectables;
import de.frajul.endlessroll.entities.Entity;
import de.frajul.endlessroll.entities.Obstacle;
import de.frajul.endlessroll.entities.Player;
import de.frajul.endlessroll.entities.collectables.Collectables;
import de.frajul.endlessroll.entities.particles.ParticleSystem;
import de.frajul.endlessroll.entities.textures.TexturePack;
import de.frajul.endlessroll.entities.tileLists.Ceiling;
@ -38,7 +38,8 @@ public abstract class Scene {
protected Ceiling ceiling;
protected Player player;
protected List<Entity> uncategorizedEntities = Collections.synchronizedList(new ArrayList<Entity>());
protected List<Entity> uncategorizedEntities = Collections
.synchronizedList(new ArrayList<Entity>());
protected List<Obstacle> obstacles = Collections.synchronizedList(new ArrayList<Obstacle>());
protected List<Tool> tools = Collections.synchronizedList(new ArrayList<Tool>());
protected Collectables collectables = new Collectables();
@ -58,7 +59,7 @@ public abstract class Scene {
this.textures = texturePack;
}
public void reset(){
public void reset() {
uncategorizedEntities.clear();
obstacles.clear();
tools.clear();
@ -83,14 +84,14 @@ public abstract class Scene {
uncategorizedEntities.remove(playerArrow);
}
private void updateEntityList(List<? extends Entity> list, Timer timer){
synchronized (list){
private void updateEntityList(List<? extends Entity> list, Timer timer) {
synchronized (list) {
Iterator<? extends Entity> iterator = list.iterator();
while(iterator.hasNext()) {
while (iterator.hasNext()) {
Entity entity = iterator.next();
if(entity instanceof Obstacle){
if (entity instanceof Obstacle) {
Obstacle obstacle = (Obstacle) entity;
if (obstacle.isMoving() && obstacle.isMovePathInSightDistance(camera))
if (obstacle.isMoving() && obstacle.isPlayerOverTrigger(player))
obstacle.moveWithMoveComponent(timer.getFrameTimeSeconds(), player);
}
boolean remove = updateEntity(entity, timer);
@ -100,21 +101,22 @@ public abstract class Scene {
}
}
private boolean updateEntity(Entity entity, Timer timer){
private boolean updateEntity(Entity entity, Timer timer) {
if (entity instanceof AnimatedEntity)
((AnimatedEntity) entity).update(timer);
Vector movement = entity.getMovement();
Vector finalMovement = new Vector(movement).mul(timer.getFrameTimeSeconds());
if(finalMovement.y < MAX_Y_MOVEMENT)
finalMovement.y = MAX_Y_MOVEMENT;
entity.move(finalMovement);
if (entity.equals(player))
moveEnviroment(finalMovement.x);
if (!(entity instanceof Obstacle)) {
Vector movement = entity.getMovement();
Vector finalMovement = new Vector(movement).mul(timer.getFrameTimeSeconds());
if (finalMovement.y < MAX_Y_MOVEMENT)
finalMovement.y = MAX_Y_MOVEMENT;
entity.move(finalMovement);
if (entity.equals(player))
moveEnviroment(finalMovement.x);
}
if (entity.isDestroyed() && entity.getDestroyEffect() != null)
entity.getDestroyEffect()
.createEffect(particleSystem, new Vector(entity.getPosition()),
new Vector(entity.getWidth(), entity.getHeight())).start();
entity.getDestroyEffect().createEffect(particleSystem, new Vector(entity.getPosition()),
new Vector(entity.getWidth(), entity.getHeight())).start();
if (entity.getRightEdge() - camera.getX() < -3f || entity.isDestroyed()) {
return true;
}