From b0dd09b8f0eafa84589608223ff416246dceef32 Mon Sep 17 00:00:00 2001
From: = <=>
Date: Tue, 9 Jan 2018 16:41:20 +0100
Subject: [PATCH] MovingObstacles now slowed down when player in stasis + are
moving to the zero position when player hits the trigger
---
.../assets/debug/levelpacks/Grasslands.xml | 4 +-
app/src/main/assets/levelpacks/Grasslands.xml | 4 +-
.../main/assets/levelpacks/Icy Mountains.xml | 2 +-
.../frajul/endlessroll/entities/Obstacle.java | 43 +++++++++++--------
.../frajul/endlessroll/entities/Player.java | 18 +++++---
.../entities/tools/PlayerInfluenceTool.java | 18 --------
.../endlessroll/entities/tools/Stasis.java | 16 ++++---
.../endlessroll/levels/MoveComponent.java | 5 +--
.../endlessroll/main/game/GameScene.java | 19 +++++++-
.../frajul/endlessroll/main/game/Scene.java | 5 ++-
10 files changed, 74 insertions(+), 60 deletions(-)
delete mode 100644 app/src/main/java/de/frajul/endlessroll/entities/tools/PlayerInfluenceTool.java
diff --git a/app/build/intermediates/assets/debug/levelpacks/Grasslands.xml b/app/build/intermediates/assets/debug/levelpacks/Grasslands.xml
index f3f1549..e6b8b10 100644
--- a/app/build/intermediates/assets/debug/levelpacks/Grasslands.xml
+++ b/app/build/intermediates/assets/debug/levelpacks/Grasslands.xml
@@ -976,8 +976,8 @@
-
-
+
+
diff --git a/app/src/main/assets/levelpacks/Grasslands.xml b/app/src/main/assets/levelpacks/Grasslands.xml
index f3f1549..e6b8b10 100644
--- a/app/src/main/assets/levelpacks/Grasslands.xml
+++ b/app/src/main/assets/levelpacks/Grasslands.xml
@@ -976,8 +976,8 @@
-
-
+
+
diff --git a/app/src/main/assets/levelpacks/Icy Mountains.xml b/app/src/main/assets/levelpacks/Icy Mountains.xml
index 2a303dc..d7f42d4 100644
--- a/app/src/main/assets/levelpacks/Icy Mountains.xml
+++ b/app/src/main/assets/levelpacks/Icy Mountains.xml
@@ -99,7 +99,7 @@
-
+
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 fefa1ee..5f15a97 100644
--- a/app/src/main/java/de/frajul/endlessroll/entities/Obstacle.java
+++ b/app/src/main/java/de/frajul/endlessroll/entities/Obstacle.java
@@ -4,8 +4,6 @@ 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;
/**
* Created by Julian on 20.11.2015.
@@ -18,11 +16,12 @@ public class Obstacle extends Entity {
private final float GRID_SQUARE_SIZE = 0.1f;
private Vector gridSize;
private MoveComponent moveComponent;
+ private float movementMultiplier = 1.0f;
private float moveProgress;
private float moveDirection;
- public Obstacle(World world, ObstacleData data, float terrainEdge) {
+ public Obstacle(World world, ObstacleData data, float terrainEdge, Player player) {
super(world.getObstacleTexture(), new Vector(data.getX(), data.getY()), data.getWidth(),
data.getHeight());
this.deadly = data.isDeadly();
@@ -35,16 +34,17 @@ public class Obstacle extends Entity {
moveComponent.init(super.getPosition());
moveProgress = moveComponent.getStartOffset();
moveDirection = moveComponent.getDirection();
+ //Constant player speed assumed
+ float timeTillPlayerReachesTrigger = player.getSpeed() * ((moveComponent
+ .getLeftmostPosition() - super.getWidth() / 2 - moveComponent
+ .getTriggerDistance()) - player.getRightEdge());
+ moveDirection *= -1;
+ moveWithMoveComponent(timeTillPlayerReachesTrigger * 1000 * 1000, player.getSpeed());
+ moveDirection *= -1;
}
gridSize = calcGridSize();
}
- public boolean isPlayerOverTrigger(Player player) {
- if (moveComponent == null)
- return false;
- return moveComponent.getLeftmostPosition() - super.getWidth() / 2 - moveComponent.getTriggerDistance() <= player.getRightEdge();
- }
-
private Vector calcGridSize() {
int gridWidth = (int) (width / GRID_SQUARE_SIZE);
int gridHeight = (int) (height / GRID_SQUARE_SIZE);
@@ -53,24 +53,33 @@ public class Obstacle extends Entity {
return new Vector(gridWidth, gridHeight);
}
- public void moveWithMoveComponent(float frameTime, Player player) {
+ public void slowMovementForOneFrame(float value) {
+ movementMultiplier *= value;
+ }
+
+ public void moveWithMoveComponent(float frameTime, float playerSpeed) {
if (moveComponent.isHasPlayerXSpeed()) {
- moveComponent.calcSpeedForPlayerSpeed(player);
+ moveComponent.calcSpeedForPlayerSpeed(playerSpeed);
}
- float distance = frameTime * moveComponent.getSpeed() * moveComponent.TRANSITION_VALUE;
- moveProgress += moveDirection * distance / moveComponent.getLength();
+ float distance = frameTime * moveComponent
+ .getSpeed() * moveComponent.TRANSITION_VALUE * movementMultiplier;
+ float newProgress = moveDirection * distance / moveComponent.getLength();
+ moveProgress += newProgress;
if (moveProgress < 0) {
moveProgress *= -1;
moveDirection *= -1;
}
- if (moveProgress > 1) {
- moveProgress = 2 - moveProgress;
- moveDirection *= -1;
+ while (moveProgress > 1) {
+ moveProgress -= 2;
+ if (moveProgress < 0) {
+ moveProgress *= -1;
+ moveDirection *= -1;
+ }
}
super.setPosition(moveComponent.getPositionForProgress(moveProgress));
super.setMovement(moveComponent.getMovementVector(moveDirection));
- GameLog.i(super.getMovement().getX() + "; " + player.getMovement().getX());
+ movementMultiplier = 1.0f;
}
public boolean isMoving() {
diff --git a/app/src/main/java/de/frajul/endlessroll/entities/Player.java b/app/src/main/java/de/frajul/endlessroll/entities/Player.java
index cae57fd..135d26a 100644
--- a/app/src/main/java/de/frajul/endlessroll/entities/Player.java
+++ b/app/src/main/java/de/frajul/endlessroll/entities/Player.java
@@ -7,7 +7,7 @@ import de.frajul.endlessroll.data.Vector;
import de.frajul.endlessroll.entities.particles.ParticleSource;
import de.frajul.endlessroll.entities.particles.ParticleSystem;
import de.frajul.endlessroll.entities.shapes.PlayerShape;
-import de.frajul.endlessroll.entities.tools.PlayerInfluenceTool;
+import de.frajul.endlessroll.entities.tools.Stasis;
import de.frajul.endlessroll.main.game.Timer;
/**
@@ -29,7 +29,7 @@ public class Player extends Entity {
private ParticleSource superPowerParticles;
private ParticleSystem particleSystem;
- private List influenceTools = new ArrayList<>();
+ private List stases = new ArrayList<>();
private List forces = new ArrayList<>();
private float gravityForce;
@@ -80,8 +80,8 @@ public class Player extends Entity {
if (!hasSuperPower && superPowerParticles != null)
superPowerParticles.kill();
- for (PlayerInfluenceTool tool : influenceTools)
- tool.influencePlayerValues(this);
+ for (Stasis stasis : stases)
+ stasis.influencePlayerMovementValues(this);
for (float force : forces)
super.getMovement().y += force;
@@ -100,7 +100,7 @@ public class Player extends Entity {
}
public void postMoveUpdate() {
- influenceTools.clear();
+ stases.clear();
forces.clear();
}
@@ -116,8 +116,12 @@ public class Player extends Entity {
return hasSuperPower;
}
- public void addInfluenceTool(PlayerInfluenceTool tool) {
- influenceTools.add(tool);
+ public void addStasis(Stasis stasis) {
+ stases.add(stasis);
+ }
+
+ public List getStases() {
+ return stases;
}
public void addForce(float force) {
diff --git a/app/src/main/java/de/frajul/endlessroll/entities/tools/PlayerInfluenceTool.java b/app/src/main/java/de/frajul/endlessroll/entities/tools/PlayerInfluenceTool.java
deleted file mode 100644
index 90082af..0000000
--- a/app/src/main/java/de/frajul/endlessroll/entities/tools/PlayerInfluenceTool.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package de.frajul.endlessroll.entities.tools;
-
-import de.frajul.endlessroll.data.Vector;
-import de.frajul.endlessroll.entities.Player;
-
-/**
- * Created by Julian on 03.11.2017.
- */
-
-public abstract class PlayerInfluenceTool extends Tool {
-
- public PlayerInfluenceTool(ToolType type, Vector position, float width, float height, boolean updateBounds, boolean placedByRightEdge) {
- super(type, position, width, height, updateBounds, placedByRightEdge);
- }
-
- public abstract void influencePlayerValues(Player player);
-
-}
diff --git a/app/src/main/java/de/frajul/endlessroll/entities/tools/Stasis.java b/app/src/main/java/de/frajul/endlessroll/entities/tools/Stasis.java
index cda28da..caab954 100644
--- a/app/src/main/java/de/frajul/endlessroll/entities/tools/Stasis.java
+++ b/app/src/main/java/de/frajul/endlessroll/entities/tools/Stasis.java
@@ -6,17 +6,19 @@ import de.frajul.endlessroll.entities.Player;
import de.frajul.endlessroll.entities.collision.geometry.Geometry;
import de.frajul.endlessroll.entities.particles.ParticleSource;
import de.frajul.endlessroll.entities.particles.ParticleSystem;
+import de.frajul.endlessroll.main.game.GameScene;
import de.frajul.endlessroll.main.game.Timer;
/**
* Created by Julian on 11.02.2016.
*/
-public class Stasis extends PlayerInfluenceTool {
+public class Stasis extends Tool {
private ParticleSource particleSource;
private boolean firstCollision = true;
private final static float Y_SLOW_FACTOR = .4f; //Final .2f
private final static float X_SLOW_FACTOR = .9f; //Final .8f
+ private float forceValue;
public Stasis(Vector position, ParticleSystem particleSystem) {
super(ToolType.STASIS, position,
@@ -30,6 +32,7 @@ public class Stasis extends PlayerInfluenceTool {
particleSource = new ParticleSource(new Vector(position), particleSystem.stasis);
particleSource.setSpawnSize(new Vector(super.width, super.height));
particleSource.start();
+ forceValue = ToolType.STASIS.getCurrentUpgradeValue(ToolUpgradeType.FORCE);
}
@Override
@@ -40,7 +43,7 @@ public class Stasis extends PlayerInfluenceTool {
@Override
public void onPlayerCollision(Player player, Timer timer) {
- player.addInfluenceTool(this);
+ player.addStasis(this);
}
@Override
@@ -53,16 +56,17 @@ public class Stasis extends PlayerInfluenceTool {
return this;
}
- @Override
- public void influencePlayerValues(Player player) {
- float forceValue = ToolType.STASIS.getCurrentUpgradeValue(ToolUpgradeType.FORCE);
- float finalXSlow = X_SLOW_FACTOR - forceValue / 20f;
+ public void influencePlayerMovementValues(Player player) {
+ float finalXSlow = getCurrentXSlowFactor();
player.manipulateAllForces(Y_SLOW_FACTOR / forceValue);
player.getMovement().setX(player.getMovement().getX() * finalXSlow);
if (firstCollision) {
player.getMovement().y *= Y_SLOW_FACTOR / forceValue;
firstCollision = false;
}
+ }
+ public float getCurrentXSlowFactor() {
+ return X_SLOW_FACTOR - forceValue / 20f;
}
}
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 90d9797..292720d 100644
--- a/app/src/main/java/de/frajul/endlessroll/levels/MoveComponent.java
+++ b/app/src/main/java/de/frajul/endlessroll/levels/MoveComponent.java
@@ -3,7 +3,6 @@ package de.frajul.endlessroll.levels;
import org.simpleframework.xml.Attribute;
import de.frajul.endlessroll.data.Vector;
-import de.frajul.endlessroll.entities.Player;
public class MoveComponent {
@@ -69,8 +68,8 @@ public class MoveComponent {
return triggerDistance;
}
- public void calcSpeedForPlayerSpeed(Player player) {
- float xSpeed = player.getSpeed();
+ public void calcSpeedForPlayerSpeed(float playerSpeed) {
+ float xSpeed = playerSpeed;
speed = xSpeed / new Vector(triangleWidth, triangleHeight).normalize().getX();
speed /= TRANSITION_VALUE;
}
diff --git a/app/src/main/java/de/frajul/endlessroll/main/game/GameScene.java b/app/src/main/java/de/frajul/endlessroll/main/game/GameScene.java
index b6a6ddf..3660205 100644
--- a/app/src/main/java/de/frajul/endlessroll/main/game/GameScene.java
+++ b/app/src/main/java/de/frajul/endlessroll/main/game/GameScene.java
@@ -11,6 +11,7 @@ import de.frajul.endlessroll.entities.particles.ParticleSystem;
import de.frajul.endlessroll.entities.shapes.PlayerShape;
import de.frajul.endlessroll.entities.textures.TexturePack;
import de.frajul.endlessroll.entities.tools.Bomb;
+import de.frajul.endlessroll.entities.tools.Stasis;
import de.frajul.endlessroll.entities.tools.Tool;
import de.frajul.endlessroll.entities.tools.ToolType;
import de.frajul.endlessroll.levels.Level;
@@ -43,7 +44,8 @@ public class GameScene extends Scene {
terrain.loadData(world, level.getTerrainEdge(), level.getTerrainTiles());
ceiling.loadData(world, level.getCeilingEdge(), level.getCeilingTiles());
uncategorizedEntities.add(goal);
- player.init(playerPlayerShape, terrain.getEdge(), level.getStartSpeed(), level.getEndSpeed(), particleSystem);
+ player.init(playerPlayerShape, terrain.getEdge(), level.getStartSpeed(),
+ level.getEndSpeed(), particleSystem);
uncategorizedEntities.add(player);
collectables.init(level, textures);
for (ObstacleData data : level.getObstacles())
@@ -63,7 +65,7 @@ public class GameScene extends Scene {
}
public void addObstacle(ObstacleData data) {
- Obstacle obstacle = new Obstacle(currentWorld, data, terrain.getEdge());
+ Obstacle obstacle = new Obstacle(currentWorld, data, terrain.getEdge(), player);
obstacles.add(obstacle);
}
@@ -81,6 +83,19 @@ public class GameScene extends Scene {
public void update(Timer timer) {
player.setSpeedByProgress(player.getProgress() / goalX);
+
+ if (!player.getStases().isEmpty()) {
+ synchronized (obstacles) {
+ for (Stasis stasis : player.getStases()) {
+ for (Obstacle obstacle : obstacles) {
+ if (obstacle.isMoving()) {
+ obstacle.slowMovementForOneFrame(stasis.getCurrentXSlowFactor());
+ }
+ }
+ }
+ }
+ }
+
player.preMoveUpdate(timer);
if (player.hasSuperPower() && player.getBottomEdge() < terrain.getEdge()) {
diff --git a/app/src/main/java/de/frajul/endlessroll/main/game/Scene.java b/app/src/main/java/de/frajul/endlessroll/main/game/Scene.java
index a459538..a8f15aa 100644
--- a/app/src/main/java/de/frajul/endlessroll/main/game/Scene.java
+++ b/app/src/main/java/de/frajul/endlessroll/main/game/Scene.java
@@ -91,8 +91,9 @@ public abstract class Scene {
Entity entity = iterator.next();
if (entity instanceof Obstacle) {
Obstacle obstacle = (Obstacle) entity;
- if (obstacle.isMoving() && obstacle.isPlayerOverTrigger(player))
- obstacle.moveWithMoveComponent(timer.getFrameTimeSeconds(), player);
+ if (obstacle.isMoving())
+ obstacle.moveWithMoveComponent(timer.getFrameTimeSeconds(),
+ player.getSpeed());
}
boolean remove = updateEntity(entity, timer);
if (remove)