2018-09-02 13:36:49 +02:00
|
|
|
package it.cavallium.warppi.extra.mario;
|
2018-04-01 01:01:57 +02:00
|
|
|
|
|
|
|
public class PlayerEntity extends MarioEntity {
|
2018-05-12 21:18:29 +02:00
|
|
|
|
2018-09-02 12:45:51 +02:00
|
|
|
@SuppressWarnings("unused")
|
2018-05-12 21:18:29 +02:00
|
|
|
private final int life;
|
2018-04-01 01:01:57 +02:00
|
|
|
public float walkAnimation = 0;
|
|
|
|
public float jumptime = 0;
|
|
|
|
public boolean walking = false;
|
|
|
|
public boolean running = false;
|
|
|
|
public boolean jumping = false;
|
|
|
|
public boolean flipped = false;
|
|
|
|
public int[] marioSkinPos = new int[] { 0, 0 };
|
|
|
|
private double controllerDX;
|
|
|
|
private double controllerDY;
|
2018-05-12 21:18:29 +02:00
|
|
|
|
2018-04-01 01:01:57 +02:00
|
|
|
public PlayerEntity(double x, double y, int life) {
|
|
|
|
super(x, y, 0, 0, true, true);
|
|
|
|
this.life = life;
|
|
|
|
}
|
2018-05-12 21:18:29 +02:00
|
|
|
|
2018-04-01 01:01:57 +02:00
|
|
|
@Override
|
|
|
|
public void gameTick(double dt) {
|
|
|
|
walkAnimation += dt;
|
2018-05-12 21:18:29 +02:00
|
|
|
x += computeFutureDX(dt);
|
|
|
|
y += computeFutureDY(dt);
|
|
|
|
forceX += computeFutureForceDX(dt);
|
|
|
|
forceY += computeFutureForceDY(dt);
|
2018-04-01 01:01:57 +02:00
|
|
|
if (controllerDX == 0) {
|
|
|
|
walking = false;
|
|
|
|
walkAnimation = 0;
|
|
|
|
} else {
|
|
|
|
if (controllerDX > 0) { //RIGHT
|
|
|
|
walking = true;
|
|
|
|
flipped = false;
|
|
|
|
}
|
|
|
|
if (controllerDX < 0) { //LEFT
|
|
|
|
walking = true;
|
|
|
|
flipped = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (controllerDY > 0) { //JUMP
|
|
|
|
if (collisionUp) {
|
|
|
|
jumptime = Float.MAX_VALUE;
|
|
|
|
jumping = false;
|
|
|
|
}
|
|
|
|
jumptime += dt;
|
|
|
|
if (jumptime <= 0.5f && !jumping && collisionDown) {
|
|
|
|
jumping = true;
|
|
|
|
collisionDown = false;
|
2018-05-12 21:18:29 +02:00
|
|
|
} else if (jumptime <= 0.5f) {} else {
|
2018-04-01 01:01:57 +02:00
|
|
|
jumping = false;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
jumping = false;
|
|
|
|
if (collisionDown) {
|
|
|
|
jumptime = 0;
|
|
|
|
} else {
|
|
|
|
jumptime = Float.MAX_VALUE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (!walking & !running & !jumping) {
|
|
|
|
marioSkinPos[0] = 0;
|
|
|
|
marioSkinPos[1] = 0;
|
|
|
|
} else if (collisionDown & walking & !running & !jumping && walkAnimation >= 0.08) {
|
|
|
|
while (walkAnimation > 0.08) {
|
|
|
|
walkAnimation -= 0.08;
|
|
|
|
if (marioSkinPos[0] == 1 & marioSkinPos[1] == 0) {
|
|
|
|
marioSkinPos[0] += 2;
|
|
|
|
} else if (marioSkinPos[0] == 3 & marioSkinPos[1] == 0) {
|
|
|
|
marioSkinPos[0] -= 1;
|
|
|
|
} else if (marioSkinPos[0] == 2 & marioSkinPos[1] == 0) {
|
|
|
|
marioSkinPos[0] -= 1;
|
|
|
|
} else {
|
|
|
|
marioSkinPos[0] = 1;
|
|
|
|
marioSkinPos[1] = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else if (jumping) {
|
|
|
|
marioSkinPos[0] = 5;
|
|
|
|
marioSkinPos[1] = 1;
|
|
|
|
}
|
|
|
|
}
|
2018-05-12 21:18:29 +02:00
|
|
|
|
|
|
|
@Override
|
2018-04-01 01:01:57 +02:00
|
|
|
public double computeFutureDX(double dt) {
|
|
|
|
return super.computeFutureDX(dt);
|
|
|
|
}
|
2018-05-12 21:18:29 +02:00
|
|
|
|
2018-04-01 01:01:57 +02:00
|
|
|
public double computeFuturedDY(double dt) {
|
|
|
|
return super.computeFutureDY(dt);
|
|
|
|
}
|
2018-05-12 21:18:29 +02:00
|
|
|
|
|
|
|
@Override
|
2018-04-01 01:01:57 +02:00
|
|
|
public double computeFutureForceDX(double dt) {
|
|
|
|
double forceX = this.forceX;
|
2018-05-12 21:18:29 +02:00
|
|
|
if (controllerDX == 0) {} else {
|
2018-04-01 01:01:57 +02:00
|
|
|
if (controllerDX > 0) { //RIGHT
|
2018-05-12 21:18:29 +02:00
|
|
|
if (forceX < 500f / 16f) {
|
|
|
|
forceX += dt * 500f / 16f;
|
2018-04-01 01:01:57 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
if (controllerDX < 0) { //LEFT
|
2018-05-12 21:18:29 +02:00
|
|
|
if (forceX > -500f / 16f) {
|
|
|
|
forceX -= dt * 500f / 16f;
|
2018-04-01 01:01:57 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2018-05-12 21:18:29 +02:00
|
|
|
|
2018-04-01 01:01:57 +02:00
|
|
|
return (forceX + super.computeFutureForceDX(dt)) - this.forceX;
|
|
|
|
}
|
2018-05-12 21:18:29 +02:00
|
|
|
|
|
|
|
@Override
|
2018-04-01 01:01:57 +02:00
|
|
|
public double computeFutureForceDY(double dt) {
|
|
|
|
float jumptime = this.jumptime;
|
|
|
|
double forceY = this.forceY;
|
|
|
|
if (controllerDY > 0) { //JUMP
|
|
|
|
if (collisionUp) {
|
|
|
|
jumptime = Float.MAX_VALUE;
|
|
|
|
}
|
|
|
|
jumptime += dt;
|
|
|
|
if (jumptime <= 0.5f && !jumping && collisionDown) {
|
2018-05-12 21:18:29 +02:00
|
|
|
forceY = dt * (4 * 1569.6f) / 16f;
|
2018-04-01 01:01:57 +02:00
|
|
|
} else if (jumptime <= 0.5f) {
|
2018-05-12 21:18:29 +02:00
|
|
|
forceY = dt * (4 * 1569.6f) / 16f;
|
2018-04-01 01:01:57 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return (forceY + super.computeFutureForceDY(dt)) - this.forceY;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void move(float dt, double dX, double dY) {
|
|
|
|
walkAnimation += dt;
|
2018-05-12 21:18:29 +02:00
|
|
|
|
|
|
|
controllerDX = dX;
|
|
|
|
controllerDY = dY;
|
2018-04-01 01:01:57 +02:00
|
|
|
}
|
2018-05-12 21:18:29 +02:00
|
|
|
|
2018-04-01 01:01:57 +02:00
|
|
|
}
|