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> </ceilingTiles>
<obstacles class="java.util.ArrayList"> <obstacles class="java.util.ArrayList">
<obstacleData floating="true" moving="true" deadly="false" leftEdge="2.0033307" rightEdge="6.0033307" height="0.28" y="0.26666635"> <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> </obstacleData>
</obstacles> </obstacles>
<stars class="java.util.ArrayList"/> <stars class="java.util.ArrayList"/>
@ -272,5 +272,19 @@
</obstacles> </obstacles>
<stars class="java.util.ArrayList"/> <stars class="java.util.ArrayList"/>
</level> </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> </levels>
</levelPack> </levelPack>

View File

@ -4,6 +4,7 @@ import de.frajul.endlessroll.data.Vector;
import de.frajul.endlessroll.levels.MoveComponent; import de.frajul.endlessroll.levels.MoveComponent;
import de.frajul.endlessroll.levels.ObstacleData; import de.frajul.endlessroll.levels.ObstacleData;
import de.frajul.endlessroll.levels.worlds.World; import de.frajul.endlessroll.levels.worlds.World;
import de.frajul.endlessroll.main.GameLog;
import de.frajul.endlessroll.main.game.Camera; import de.frajul.endlessroll.main.game.Camera;
/** /**
@ -28,14 +29,13 @@ public class Obstacle extends Entity {
this.floating = data.isFloating(); this.floating = data.isFloating();
this.moving = data.isMoving(); this.moving = data.isMoving();
this.moveComponent = data.getMoveComponent(); this.moveComponent = data.getMoveComponent();
if (!floating)
super.setToTerrain(terrainEdge);
if (moveComponent != null && moving) { if (moveComponent != null && moving) {
moveComponent.init(super.getPosition()); moveComponent.init(super.getPosition());
moveProgress = moveComponent.getStartOffset(); moveProgress = moveComponent.getStartOffset();
moveDirection = moveComponent.getDirection(); moveDirection = moveComponent.getDirection();
} }
if (!floating)
super.setToTerrain(terrainEdge);
gridSize = calcGridSize(); gridSize = calcGridSize();
} }
@ -54,10 +54,10 @@ public class Obstacle extends Entity {
} }
public void moveWithMoveComponent(float frameTime, Player player) { public void moveWithMoveComponent(float frameTime, Player player) {
if(moveComponent.isHasPlayerXSpeed()){ if (moveComponent.isHasPlayerXSpeed()) {
moveComponent.calcSpeedForPlayerSpeed(player); moveComponent.calcSpeedForPlayerSpeed(player);
} }
float distance = frameTime * moveComponent.getSpeed(); float distance = frameTime * moveComponent.getSpeed() * moveComponent.TRANSITION_VALUE;
moveProgress += moveDirection * distance / moveComponent.getLength(); moveProgress += moveDirection * distance / moveComponent.getLength();
if (moveProgress < 0) { if (moveProgress < 0) {
moveProgress *= -1; 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.Circle;
import de.frajul.endlessroll.entities.collision.geometry.Quad; import de.frajul.endlessroll.entities.collision.geometry.Quad;
import de.frajul.endlessroll.entities.collision.geometry.Triangle; import de.frajul.endlessroll.entities.collision.geometry.Triangle;
import de.frajul.endlessroll.main.GameLog;
/** /**
* Created by Julian on 01.12.2015. * Created by Julian on 01.12.2015.
@ -139,6 +140,7 @@ public class CollisionDetector {
if (isCircleQuadCollision(circle, quad)) { if (isCircleQuadCollision(circle, quad)) {
Edge edge = circleQuadCollisionEdge(circle, player.getMovement(), quad, Edge edge = circleQuadCollisionEdge(circle, player.getMovement(), quad,
entity.getMovement()); 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(entity, edge);
} }
return new EntityCollisionData(null, null); return new EntityCollisionData(null, null);
@ -151,9 +153,9 @@ public class CollisionDetector {
if (relativeMovement.x > 0) { if (relativeMovement.x > 0) {
//LEFT || BOTTOM //LEFT || BOTTOM
if (relativeMovement.y > 0) { 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 float actualY = toLeftDistance * (relativeMovement.y / relativeMovement.x) + circle
.getCenter().y; .getCenter().y + circle.getRadius();
if (actualY < quad.getBottomEdge()) if (actualY < quad.getBottomEdge())
return Edge.BOTTOM; return Edge.BOTTOM;
else else
@ -161,23 +163,24 @@ public class CollisionDetector {
} }
//LEFT || TOP //LEFT || TOP
else if (relativeMovement.y < 0) { 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 float actualY = toLeftDistance * (relativeMovement.y / relativeMovement.x) + circle
.getCenter().y; .getCenter().y - circle.getRadius();
if (actualY < quad.getTopEdge()) if (actualY < quad.getTopEdge())
return Edge.LEFT; return Edge.LEFT;
else else
return Edge.TOP; return Edge.TOP;
} else } else {
return Edge.LEFT; return Edge.LEFT;
}
} }
//RIGHT || TOP || BOTTOM //RIGHT || TOP || BOTTOM
else if (relativeMovement.x < 0) { else if (relativeMovement.x < 0) {
//RIGHT || BOTTOM //RIGHT || BOTTOM
if (relativeMovement.y > 0) { 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 float actualY = toRightDistance * (relativeMovement.y / relativeMovement.x) + circle
.getCenter().y; .getCenter().y + circle.getRadius();
if (actualY < quad.getBottomEdge()) if (actualY < quad.getBottomEdge())
return Edge.BOTTOM; return Edge.BOTTOM;
else else
@ -185,15 +188,16 @@ public class CollisionDetector {
} }
//RIGHT || TOP //RIGHT || TOP
else if (relativeMovement.y < 0) { 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 float actualY = toRightDistance * (relativeMovement.y / relativeMovement.x) + circle
.getCenter().y; .getCenter().y - circle.getRadius();
if (actualY < quad.getTopEdge()) if (actualY < quad.getTopEdge())
return Edge.RIGHT; return Edge.RIGHT;
else else
return Edge.TOP; return Edge.TOP;
} else } else {
return Edge.RIGHT; return Edge.RIGHT;
}
} else { } else {
if (relativeMovement.y > 0) if (relativeMovement.y > 0)
return Edge.BOTTOM; 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.PlayerCollisionData;
import de.frajul.endlessroll.entities.collision.collisionData.ToolCollisionData; import de.frajul.endlessroll.entities.collision.collisionData.ToolCollisionData;
import de.frajul.endlessroll.entities.tools.Tool; 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.Game;
import de.frajul.endlessroll.main.game.GameScene; import de.frajul.endlessroll.main.game.GameScene;
import de.frajul.endlessroll.main.game.Timer; import de.frajul.endlessroll.main.game.Timer;
@ -50,13 +51,13 @@ public class CollisionManager {
} }
private void checkTerrainCollision(EntityCollisionData data) { private void checkTerrainCollision(EntityCollisionData data) {
checkEntityCollision(data, -0.01f); checkEntityCollision(data);
if (data.getEdge() != Edge.TOP) if (data.getEdge() != Edge.TOP)
game.onGameOver(true); game.onGameOver(true);
} }
private void checkCeilingCollision(EntityCollisionData data) { private void checkCeilingCollision(EntityCollisionData data) {
checkEntityCollision(data, -0.01f); checkEntityCollision(data);
if (data.getEdge() == Edge.RIGHT || data.getEdge() == Edge.LEFT) if (data.getEdge() == Edge.RIGHT || data.getEdge() == Edge.LEFT)
game.onGameOver(true); game.onGameOver(true);
} }
@ -75,12 +76,12 @@ public class CollisionManager {
.isDeadly()) .isDeadly())
game.onGameOver(true); game.onGameOver(true);
else else
checkEntityCollision(entityData, 0); checkEntityCollision(entityData);
} }
} }
} }
private void checkEntityCollision(EntityCollisionData data, float xBounceFactor) { private void checkEntityCollision(EntityCollisionData data) {
switch (data.getEdge()) { switch (data.getEdge()) {
case TOP: case TOP:
player.getMovement().y = 0; player.getMovement().y = 0;
@ -91,11 +92,9 @@ public class CollisionManager {
player.setTopEdge(data.getEntity().getBottomEdge()); player.setTopEdge(data.getEntity().getBottomEdge());
break; break;
case LEFT: case LEFT:
player.getMovement().x *= xBounceFactor;
player.getPosition().x = data.getEntity().getLeftEdge() - player.RADIUS; player.getPosition().x = data.getEntity().getLeftEdge() - player.RADIUS;
break; break;
case RIGHT: case RIGHT:
player.getMovement().x *= xBounceFactor;
player.getPosition().x = data.getEntity().getRightEdge() + player.RADIUS; player.getPosition().x = data.getEntity().getRightEdge() + player.RADIUS;
break; break;
} }

View File

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