fixed bug with tools not being set on top of obstacles Tools are no longer moved to left if set hard on edge of obstacle
144 lines
4.1 KiB
Java
144 lines
4.1 KiB
Java
package de.frajul.endlessroll.entities;
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
|
|
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.Stasis;
|
|
import de.frajul.endlessroll.main.game.Timer;
|
|
|
|
/**
|
|
* Created by Julian on 20.11.2015.
|
|
*/
|
|
public class Player extends Entity {
|
|
|
|
private final float ROTATION_SPEED = -400;
|
|
public final float RADIUS = 0.1f;
|
|
private final float START_X = -0.9f;
|
|
private final float SPEED = 0.002f;
|
|
|
|
private float startSpeed, endSpeed;
|
|
private float speed = SPEED;
|
|
|
|
private long currentSuperPowerDuration;
|
|
private boolean hasSuperPower;
|
|
private long superPowerDuration;
|
|
private ParticleSource superPowerParticles;
|
|
|
|
private ParticleSystem particleSystem;
|
|
private List<Stasis> stases = new ArrayList<>();
|
|
private List<Float> forces = new ArrayList<>();
|
|
private float gravityForce;
|
|
|
|
public Player() {
|
|
super(PlayerShape.BALL.getTexture(), new Vector(), 0, 0);
|
|
super.setWidth(RADIUS * 2);
|
|
super.setHeight(RADIUS * 2);
|
|
}
|
|
|
|
public void reset(){
|
|
|
|
}
|
|
|
|
public void startSuperPower(long duration) {
|
|
this.superPowerDuration = duration;
|
|
currentSuperPowerDuration = 0;
|
|
hasSuperPower = true;
|
|
superPowerParticles = new ParticleSource(
|
|
new Vector(super.getPosition().x, super.getPosition().y), particleSystem.superPower);
|
|
superPowerParticles.start();
|
|
}
|
|
|
|
public void init(PlayerShape playerShape, float terrainEdge, float startSpeed, float endSpeed, ParticleSystem particleSystem) {
|
|
super.setTexture(playerShape.getTexture());
|
|
super.setToTerrain(terrainEdge);
|
|
super.getPosition().x = START_X;
|
|
super.setMovement(new Vector(speed, 0));
|
|
gravityForce = 0;
|
|
hasSuperPower = false;
|
|
forces.clear();
|
|
this.startSpeed = startSpeed;
|
|
this.endSpeed = endSpeed;
|
|
setSpeedByProgress(0);
|
|
this.particleSystem = particleSystem;
|
|
}
|
|
|
|
public void setSpeedByProgress(float progress) {
|
|
this.speed = ((endSpeed - startSpeed) * progress + startSpeed) * SPEED;
|
|
super.getMovement().x = speed;
|
|
}
|
|
|
|
public void preMoveUpdate(Timer timer) {
|
|
if (hasSuperPower && superPowerParticles != null) {
|
|
currentSuperPowerDuration += timer.getFrameTimeMilliseconds();
|
|
hasSuperPower = superPowerDuration >= currentSuperPowerDuration;
|
|
superPowerParticles.setPosition(new Vector(super.getPosition()));
|
|
}
|
|
if (!hasSuperPower && superPowerParticles != null)
|
|
superPowerParticles.kill();
|
|
|
|
for (Stasis stasis : stases)
|
|
stasis.influencePlayerMovementValues(this);
|
|
|
|
for (float force : forces)
|
|
super.getMovement().y += force;
|
|
super.getMovement().y += gravityForce;
|
|
}
|
|
|
|
public void clearAllForces() {
|
|
forces.clear();
|
|
gravityForce = 0;
|
|
}
|
|
|
|
public void manipulateAllForces(float factor) {
|
|
for (int i = 0; i < forces.size(); i++)
|
|
forces.set(i, forces.get(i) * factor);
|
|
gravityForce *= factor * factor;
|
|
}
|
|
|
|
public void postMoveUpdate() {
|
|
stases.clear();
|
|
forces.clear();
|
|
}
|
|
|
|
public float getProgress() {
|
|
return getPosition().x - START_X;
|
|
}
|
|
|
|
public float getSpeed() {
|
|
return speed;
|
|
}
|
|
|
|
public boolean hasSuperPower() {
|
|
return hasSuperPower;
|
|
}
|
|
|
|
public void addStasis(Stasis stasis) {
|
|
stases.add(stasis);
|
|
}
|
|
|
|
public List<Stasis> getStases() {
|
|
return stases;
|
|
}
|
|
|
|
public void addForce(float force) {
|
|
forces.add(force);
|
|
}
|
|
|
|
public void setGravityForce(float gravityForce) {
|
|
this.gravityForce = gravityForce;
|
|
}
|
|
|
|
@Override
|
|
public void move(Vector movement) {
|
|
super.move(movement);
|
|
float circumference = 2 * 3.14f * RADIUS;
|
|
float rotation = -360 * (movement.x / circumference);
|
|
rotate(rotation);
|
|
}
|
|
|
|
}
|