MovingObstacles now slowed down when player in stasis + are moving to the zero position when player hits the trigger

This commit is contained in:
=
2018-01-09 16:41:20 +01:00
parent 4629419d3e
commit b0dd09b8f0
10 changed files with 74 additions and 60 deletions

View File

@ -976,8 +976,8 @@
<obstacleData floating="true" moving="false" deadly="false" leftEdge="18.443184" rightEdge="20.150185" height="0.5" y="0.2733334">
<moveComponent length="0.0" rotation="0.0" startOffset="0.0" direction="0.0" speed="0.0" hasPlayerXSpeed="false" triggerDistance="0.0"/>
</obstacleData>
<obstacleData floating="true" moving="true" deadly="true" leftEdge="24.014523" rightEdge="24.345524" height="0.331" y="-0.3799998">
<moveComponent length="2.74" rotation="90.0" startOffset="1.0" direction="1.0" speed="0.609" hasPlayerXSpeed="false" triggerDistance="0.0"/>
<obstacleData floating="true" moving="true" deadly="true" leftEdge="22.634523" rightEdge="22.965525" height="0.331" y="-0.37333316">
<moveComponent length="2.74" rotation="90.0" startOffset="0.5" direction="1.0" speed="0.609" hasPlayerXSpeed="false" triggerDistance="0.0"/>
</obstacleData>
<obstacleData floating="true" moving="false" deadly="false" leftEdge="20.568808" rightEdge="22.097807" height="0.166" y="-4.656613E-9">
<moveComponent length="0.0" rotation="0.0" startOffset="0.0" direction="0.0" speed="0.0" hasPlayerXSpeed="false" triggerDistance="0.0"/>

View File

@ -976,8 +976,8 @@
<obstacleData floating="true" moving="false" deadly="false" leftEdge="18.443184" rightEdge="20.150185" height="0.5" y="0.2733334">
<moveComponent length="0.0" rotation="0.0" startOffset="0.0" direction="0.0" speed="0.0" hasPlayerXSpeed="false" triggerDistance="0.0"/>
</obstacleData>
<obstacleData floating="true" moving="true" deadly="true" leftEdge="24.014523" rightEdge="24.345524" height="0.331" y="-0.3799998">
<moveComponent length="2.74" rotation="90.0" startOffset="1.0" direction="1.0" speed="0.609" hasPlayerXSpeed="false" triggerDistance="0.0"/>
<obstacleData floating="true" moving="true" deadly="true" leftEdge="22.634523" rightEdge="22.965525" height="0.331" y="-0.37333316">
<moveComponent length="2.74" rotation="90.0" startOffset="0.5" direction="1.0" speed="0.609" hasPlayerXSpeed="false" triggerDistance="0.0"/>
</obstacleData>
<obstacleData floating="true" moving="false" deadly="false" leftEdge="20.568808" rightEdge="22.097807" height="0.166" y="-4.656613E-9">
<moveComponent length="0.0" rotation="0.0" startOffset="0.0" direction="0.0" speed="0.0" hasPlayerXSpeed="false" triggerDistance="0.0"/>

View File

@ -99,7 +99,7 @@
</ceilingTiles>
<obstacles class="java.util.ArrayList">
<obstacleData floating="true" moving="true" deadly="false" leftEdge="-1.1566665" rightEdge="-0.6566666" height="0.5" y="-0.99333346">
<moveComponent length="3.687" rotation="55.602" startOffset="0.0" direction="1.0" speed="0.0" hasPlayerXSpeed="true" triggerDistance="0.0"/>
<moveComponent length="3.687" rotation="55.602" startOffset="0.0" direction="1.0" speed="0.0" hasPlayerXSpeed="true" triggerDistance="-0.204"/>
</obstacleData>
</obstacles>
<stars class="java.util.ArrayList"/>

View File

@ -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() {

View File

@ -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<PlayerInfluenceTool> influenceTools = new ArrayList<>();
private List<Stasis> stases = new ArrayList<>();
private List<Float> 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<Stasis> getStases() {
return stases;
}
public void addForce(float force) {

View File

@ -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);
}

View File

@ -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;
}
}

View File

@ -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;
}

View File

@ -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()) {

View File

@ -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)