fixed jump
This commit is contained in:
@@ -526,24 +526,6 @@ public class Worm extends GameObject {
|
|||||||
break;
|
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;
|
return nextLoc;
|
||||||
}
|
}
|
||||||
@@ -673,14 +655,20 @@ public class Worm extends GameObject {
|
|||||||
|
|
||||||
if (!canJump())
|
if (!canJump())
|
||||||
throw new IllegalStateException();
|
throw new IllegalStateException();
|
||||||
double distance = jumpDistance(this.jumpVelocity());
|
|
||||||
Coordinate newLocation = Coordinate.create( getLocation().getX() + distance, getLocation().getY());
|
|
||||||
|
|
||||||
if (getWorld().isAdjacent(newLocation, getRadius()) && canHaveAsJumpDistance(distance)) {
|
double v = jumpVelocity();
|
||||||
if (!isValidLocation(newLocation)) terminate();
|
double t = calcJumpTime();
|
||||||
setLocation(newLocation);
|
double a = getOrientation();
|
||||||
setActionPoints(0);
|
|
||||||
|
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() {
|
public double jumpTime() {
|
||||||
|
|
||||||
if (getOrientation() >= PI || getActionPoints() == 0)
|
return calcJumpTime();
|
||||||
throw new IllegalStateException();
|
|
||||||
|
|
||||||
return (jumpDistance(jumpVelocity()) / (jumpVelocity() * cos(getOrientation())));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -719,10 +704,72 @@ public class Worm extends GameObject {
|
|||||||
if (Double.isNaN(deltaTime) || deltaTime > this.jumpTime() || deltaTime < 0)
|
if (Double.isNaN(deltaTime) || deltaTime > this.jumpTime() || deltaTime < 0)
|
||||||
throw new IllegalArgumentException();
|
throw new IllegalArgumentException();
|
||||||
|
|
||||||
return Coordinate.create(getLocation().getX() + this.jumpVelocity() * cos(getOrientation()) * deltaTime,
|
double velocity = this.jumpVelocity();
|
||||||
getLocation().getY() + this.jumpVelocity() * sin(getOrientation()) * deltaTime - 0.5 * G * pow(deltaTime, 2));
|
|
||||||
|
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
|
* Return a boolean whether the worm can jump or not
|
||||||
*
|
*
|
||||||
|
Reference in New Issue
Block a user