julian b49fa71d1f Added soccer-player-shape
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
2018-07-06 16:03:40 +02:00

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