diff --git a/app/src/main/assets/levelpacks/Icy Mountains.xml b/app/src/main/assets/levelpacks/Icy Mountains.xml index e481e59..019adea 100644 --- a/app/src/main/assets/levelpacks/Icy Mountains.xml +++ b/app/src/main/assets/levelpacks/Icy Mountains.xml @@ -43,7 +43,7 @@ - + @@ -272,5 +272,19 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/de/frajul/endlessroll/entities/Obstacle.java b/app/src/main/java/de/frajul/endlessroll/entities/Obstacle.java index 7bdfb77..304870d 100644 --- a/app/src/main/java/de/frajul/endlessroll/entities/Obstacle.java +++ b/app/src/main/java/de/frajul/endlessroll/entities/Obstacle.java @@ -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; diff --git a/app/src/main/java/de/frajul/endlessroll/entities/collision/CollisionDetector.java b/app/src/main/java/de/frajul/endlessroll/entities/collision/CollisionDetector.java index 17458e6..a5131a4 100644 --- a/app/src/main/java/de/frajul/endlessroll/entities/collision/CollisionDetector.java +++ b/app/src/main/java/de/frajul/endlessroll/entities/collision/CollisionDetector.java @@ -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; diff --git a/app/src/main/java/de/frajul/endlessroll/entities/collision/CollisionManager.java b/app/src/main/java/de/frajul/endlessroll/entities/collision/CollisionManager.java index 25839a7..5c89bc6 100644 --- a/app/src/main/java/de/frajul/endlessroll/entities/collision/CollisionManager.java +++ b/app/src/main/java/de/frajul/endlessroll/entities/collision/CollisionManager.java @@ -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; } diff --git a/app/src/main/java/de/frajul/endlessroll/levels/MoveComponent.java b/app/src/main/java/de/frajul/endlessroll/levels/MoveComponent.java index 7a45e3f..e4cfda0 100644 --- a/app/src/main/java/de/frajul/endlessroll/levels/MoveComponent.java +++ b/app/src/main/java/de/frajul/endlessroll/levels/MoveComponent.java @@ -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() {