MovingObstacles now slowed down when player in stasis + are moving to the zero position when player hits the trigger
This commit is contained in:
@ -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"/>
|
||||
|
@ -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"/>
|
||||
|
@ -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"/>
|
||||
|
@ -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() {
|
||||
|
@ -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) {
|
||||
|
@ -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);
|
||||
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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()) {
|
||||
|
@ -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)
|
||||
|
Reference in New Issue
Block a user