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)