Fixed bugs with moving Obstacles

This commit is contained in:
= 2018-01-02 12:51:05 +01:00
parent 0ab80bd6ad
commit aec77b5114
5 changed files with 41 additions and 25 deletions

View File

@ -43,7 +43,7 @@
</ceilingTiles>
<obstacles class="java.util.ArrayList">
<obstacleData floating="true" moving="true" deadly="false" leftEdge="2.0033307" rightEdge="6.0033307" height="0.28" y="0.26666635">
<moveComponent length="1.402" rotation="0.0" startOffset="0.886" direction="-1.0" speed="0.5" hasPlayerXSpeed="false"/>
<moveComponent length="1.402" rotation="0.0" startOffset="0.937" direction="-1.0" speed="0.5" hasPlayerXSpeed="false"/>
</obstacleData>
</obstacles>
<stars class="java.util.ArrayList"/>
@ -272,5 +272,19 @@
</obstacles>
<stars class="java.util.ArrayList"/>
</level>
<level packId="2" id="19" goalX="3.0" startSpeed="0.3" endSpeed="0.3" terrainEdge="-0.6" ceilingEdge="1.0">
<terrainTiles class="java.util.ArrayList">
<tileData x="0.0" width="6.0"/>
</terrainTiles>
<ceilingTiles class="java.util.ArrayList">
<tileData x="0.0" width="6.0"/>
</ceilingTiles>
<obstacles class="java.util.ArrayList">
<obstacleData floating="false" moving="true" deadly="false" leftEdge="-0.25" rightEdge="0.25" height="0.5" y="0.0">
<moveComponent length="5.0" rotation="90.0" startOffset="0.444" direction="1.0" speed="0.503" hasPlayerXSpeed="true"/>
</obstacleData>
</obstacles>
<stars class="java.util.ArrayList"/>
</level>
</levels>
</levelPack>

View File

@ -4,6 +4,7 @@ import de.frajul.endlessroll.data.Vector;
import de.frajul.endlessroll.levels.MoveComponent;
import de.frajul.endlessroll.levels.ObstacleData;
import de.frajul.endlessroll.levels.worlds.World;
import de.frajul.endlessroll.main.GameLog;
import de.frajul.endlessroll.main.game.Camera;
/**
@ -28,14 +29,13 @@ public class Obstacle extends Entity {
this.floating = data.isFloating();
this.moving = data.isMoving();
this.moveComponent = data.getMoveComponent();
if (!floating)
super.setToTerrain(terrainEdge);
if (moveComponent != null && moving) {
moveComponent.init(super.getPosition());
moveProgress = moveComponent.getStartOffset();
moveDirection = moveComponent.getDirection();
}
if (!floating)
super.setToTerrain(terrainEdge);
gridSize = calcGridSize();
}
@ -54,10 +54,10 @@ public class Obstacle extends Entity {
}
public void moveWithMoveComponent(float frameTime, Player player) {
if(moveComponent.isHasPlayerXSpeed()){
if (moveComponent.isHasPlayerXSpeed()) {
moveComponent.calcSpeedForPlayerSpeed(player);
}
float distance = frameTime * moveComponent.getSpeed();
float distance = frameTime * moveComponent.getSpeed() * moveComponent.TRANSITION_VALUE;
moveProgress += moveDirection * distance / moveComponent.getLength();
if (moveProgress < 0) {
moveProgress *= -1;

View File

@ -7,6 +7,7 @@ import de.frajul.endlessroll.entities.collision.collisionData.EntityCollisionDat
import de.frajul.endlessroll.entities.collision.geometry.Circle;
import de.frajul.endlessroll.entities.collision.geometry.Quad;
import de.frajul.endlessroll.entities.collision.geometry.Triangle;
import de.frajul.endlessroll.main.GameLog;
/**
* Created by Julian on 01.12.2015.
@ -139,6 +140,7 @@ public class CollisionDetector {
if (isCircleQuadCollision(circle, quad)) {
Edge edge = circleQuadCollisionEdge(circle, player.getMovement(), quad,
entity.getMovement());
//Obstacles with MoveComponent do not have entity.getMovement() --> if player not moving, relativeMovement.x = 0
return new EntityCollisionData(entity, edge);
}
return new EntityCollisionData(null, null);
@ -151,9 +153,9 @@ public class CollisionDetector {
if (relativeMovement.x > 0) {
//LEFT || BOTTOM
if (relativeMovement.y > 0) {
float toLeftDistance = quad.getLeftEdge() - circle.getCenter().x;
float toLeftDistance = quad.getLeftEdge() - circle.getCenter().x - circle.getRadius();
float actualY = toLeftDistance * (relativeMovement.y / relativeMovement.x) + circle
.getCenter().y;
.getCenter().y + circle.getRadius();
if (actualY < quad.getBottomEdge())
return Edge.BOTTOM;
else
@ -161,23 +163,24 @@ public class CollisionDetector {
}
//LEFT || TOP
else if (relativeMovement.y < 0) {
float toLeftDistance = quad.getLeftEdge() - circle.getCenter().x;
float toLeftDistance = quad.getLeftEdge() - circle.getCenter().x - circle.getRadius();
float actualY = toLeftDistance * (relativeMovement.y / relativeMovement.x) + circle
.getCenter().y;
.getCenter().y - circle.getRadius();
if (actualY < quad.getTopEdge())
return Edge.LEFT;
else
return Edge.TOP;
} else
} else {
return Edge.LEFT;
}
}
//RIGHT || TOP || BOTTOM
else if (relativeMovement.x < 0) {
//RIGHT || BOTTOM
if (relativeMovement.y > 0) {
float toRightDistance = quad.getRightEdge() - circle.getCenter().x;
float toRightDistance = quad.getRightEdge() - circle.getCenter().x + circle.getRadius();
float actualY = toRightDistance * (relativeMovement.y / relativeMovement.x) + circle
.getCenter().y;
.getCenter().y + circle.getRadius();
if (actualY < quad.getBottomEdge())
return Edge.BOTTOM;
else
@ -185,15 +188,16 @@ public class CollisionDetector {
}
//RIGHT || TOP
else if (relativeMovement.y < 0) {
float toRightDistance = quad.getRightEdge() - circle.getCenter().x;
float toRightDistance = quad.getRightEdge() - circle.getCenter().x + circle.getRadius();
float actualY = toRightDistance * (relativeMovement.y / relativeMovement.x) + circle
.getCenter().y;
.getCenter().y - circle.getRadius();
if (actualY < quad.getTopEdge())
return Edge.RIGHT;
else
return Edge.TOP;
} else
} else {
return Edge.RIGHT;
}
} else {
if (relativeMovement.y > 0)
return Edge.BOTTOM;

View File

@ -10,6 +10,7 @@ import de.frajul.endlessroll.entities.collision.collisionData.ObstacleCollisionD
import de.frajul.endlessroll.entities.collision.collisionData.PlayerCollisionData;
import de.frajul.endlessroll.entities.collision.collisionData.ToolCollisionData;
import de.frajul.endlessroll.entities.tools.Tool;
import de.frajul.endlessroll.main.GameLog;
import de.frajul.endlessroll.main.game.Game;
import de.frajul.endlessroll.main.game.GameScene;
import de.frajul.endlessroll.main.game.Timer;
@ -50,13 +51,13 @@ public class CollisionManager {
}
private void checkTerrainCollision(EntityCollisionData data) {
checkEntityCollision(data, -0.01f);
checkEntityCollision(data);
if (data.getEdge() != Edge.TOP)
game.onGameOver(true);
}
private void checkCeilingCollision(EntityCollisionData data) {
checkEntityCollision(data, -0.01f);
checkEntityCollision(data);
if (data.getEdge() == Edge.RIGHT || data.getEdge() == Edge.LEFT)
game.onGameOver(true);
}
@ -75,12 +76,12 @@ public class CollisionManager {
.isDeadly())
game.onGameOver(true);
else
checkEntityCollision(entityData, 0);
checkEntityCollision(entityData);
}
}
}
private void checkEntityCollision(EntityCollisionData data, float xBounceFactor) {
private void checkEntityCollision(EntityCollisionData data) {
switch (data.getEdge()) {
case TOP:
player.getMovement().y = 0;
@ -91,11 +92,9 @@ public class CollisionManager {
player.setTopEdge(data.getEntity().getBottomEdge());
break;
case LEFT:
player.getMovement().x *= xBounceFactor;
player.getPosition().x = data.getEntity().getLeftEdge() - player.RADIUS;
break;
case RIGHT:
player.getMovement().x *= xBounceFactor;
player.getPosition().x = data.getEntity().getRightEdge() + player.RADIUS;
break;
}

View File

@ -20,7 +20,7 @@ public class MoveComponent {
@Attribute
private boolean hasPlayerXSpeed;
private final float TRANSITION_VALUE = 0.001f;
public final float TRANSITION_VALUE = 0.001f;
private Vector position;
private float triangleWidth;
private float triangleHeight;
@ -37,8 +37,6 @@ public class MoveComponent {
x -= startOffset * triangleWidth;
y -= startOffset * triangleHeight;
this.position = new Vector(x, y);
speed *= TRANSITION_VALUE;
}
public float getLength() {
@ -70,6 +68,7 @@ public class MoveComponent {
double invertRotationRadians = Math.toRadians(90 - getRotation());
float ySpeed = (float) (xSpeed * Math.sin(invertRotationRadians));
speed = (float) Math.sqrt(xSpeed * xSpeed + ySpeed * ySpeed);
speed /= TRANSITION_VALUE;
}
public float getLeftmostPosition() {