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