fixed jump

This commit is contained in:
2018-04-16 15:42:53 +02:00
parent 8c2cb68d22
commit 35fb734030

View File

@@ -526,24 +526,6 @@ public class Worm extends GameObject {
break;
}
}
// while(getDistance(currentLocation, nextLoc) < maxDistance) {
// nextLoc = Coordinate.create(round((nextLoc.getX() + 0.1 * cos(direction)) * 100.0) / 100.0,
// round((nextLoc.getY() + 0.1 * sin(direction)) * 100.0) / 100.0);
// if (!world.isPassable(nextLoc.toArray(), radius)) {
// break;
// }
// }
// double max = radius * 0.1 + 0.001;
// while(!world.isAdjacent(nextLoc.toArray(), radius)) {
// max -= 0.01;
// if (max < 0) {
// nextLoc = currentLocation;
// break;
// }
// nextLoc = Coordinate.create(round((nextLoc.getX() - 0.01 * cos(direction)) * 100.0) / 100.0,
// round((nextLoc.getY() - 0.01 * sin(direction)) * 100.0) / 100.0);
// }
//if (getDistance(currentLocation, prevLoc) > getDistance(currentLocation, nextLoc)) return prevLoc;
return nextLoc;
}
@@ -673,14 +655,20 @@ public class Worm extends GameObject {
if (!canJump())
throw new IllegalStateException();
double distance = jumpDistance(this.jumpVelocity());
Coordinate newLocation = Coordinate.create( getLocation().getX() + distance, getLocation().getY());
if (getWorld().isAdjacent(newLocation, getRadius()) && canHaveAsJumpDistance(distance)) {
if (!isValidLocation(newLocation)) terminate();
setLocation(newLocation);
setActionPoints(0);
double v = jumpVelocity();
double t = calcJumpTime();
double a = getOrientation();
Coordinate newLocation = Coordinate.create(getLocation().getX() + v * t * cos(a), getLocation().getY() + v * t * sin(a) - (G * t * t) / 2.0);
if (!isValidLocation(newLocation)) {
terminate();
return;
}
setLocation(newLocation);
setActionPoints(0);
}
/**
@@ -695,10 +683,7 @@ public class Worm extends GameObject {
*/
public double jumpTime() {
if (getOrientation() >= PI || getActionPoints() == 0)
throw new IllegalStateException();
return (jumpDistance(jumpVelocity()) / (jumpVelocity() * cos(getOrientation())));
return calcJumpTime();
}
/**
@@ -719,10 +704,72 @@ public class Worm extends GameObject {
if (Double.isNaN(deltaTime) || deltaTime > this.jumpTime() || deltaTime < 0)
throw new IllegalArgumentException();
return Coordinate.create(getLocation().getX() + this.jumpVelocity() * cos(getOrientation()) * deltaTime,
getLocation().getY() + this.jumpVelocity() * sin(getOrientation()) * deltaTime - 0.5 * G * pow(deltaTime, 2));
double velocity = this.jumpVelocity();
return Coordinate.create(getLocation().getX() + velocity * cos(getOrientation()) * deltaTime,
getLocation().getY() + velocity * sin(getOrientation()) * deltaTime - 0.5 * G * pow(deltaTime, 2));
}
private double calcJumpTime(){
double v = jumpVelocity();
double t = 0;
double a = getOrientation();
Coordinate loc = getLocation();
World world = getWorld();
double radius = getRadius();
Coordinate newLoc;
while(true) {
t += 0.05;
double x = loc.getX() + v * t * cos(a);
double y = loc.getY() + v * t * sin(a) - (G * t * t) / 2.0;
newLoc = Coordinate.create(x, y);
if (!world.isPassable(newLoc, radius) || x < 0 || y < 0 || x > world.getWidth() || y > world.getHeight()) {
while (true) {
t -= 0.01;
newLoc = Coordinate.create(loc.getX() + v * t * cos(a), loc.getY() + v * t * sin(a) - (G * t * t) / 2.0);
if (newLoc.getX() < 0 || newLoc.getY() < 0 || newLoc.getX() > getWorld().getWidth() ||
newLoc.getY() > world.getHeight() || world.isAdjacent(newLoc, radius)) {
break;
}
}
break;
}
if ((int) round(t) == 10) {
throw new RuntimeException();
}
}
return t;
}
// private Coordinate getJumpLocation() {
//
// double v = jumpVelocity();
// double t = calcJumpTime();
// double a = getOrientation();
// double radius = getRadius();
// World world = getWorld();
// Coordinate loc = getLocation();
// Coordinate newLoc;
//
// while (true) {
//
// t -= 0.01;
// newLoc = Coordinate.create(loc.getX() + v * t * cos(a), loc.getY() + v * t * sin(a) - (G * t * t) / 2.0);
//
// if (newLoc.getX() < 0 || newLoc.getY() < 0 ||
// newLoc.getX() > getWorld().getWidth() || newLoc.getY() > world.getHeight()) {
// return newLoc;
// }
// if (world.isAdjacent(newLoc, radius)) return newLoc;
// }
// }
/**
* Return a boolean whether the worm can jump or not
*