Fixed bugs with moving Obstacles
This commit is contained in:
parent
0ab80bd6ad
commit
aec77b5114
@ -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>
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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() {
|
||||
|
Loading…
x
Reference in New Issue
Block a user