Я делаю 2d Platformer на Java, и по какой-то причине, когда игрок прыгает к платформе, он иногда застревает.Вот изображение проблемы:
Как вы видите, я прыгал на вершину платформы, но она застряла.
Вот мой код столкновения для падения / прыжка:
if (guy.getJumpState() == false) {
if (canExecuteMovement(0, 8)) {
...
onGround = false;
if (guy.getY() > this.getParent().getHeight() / 2 - 100) {
// if you are in the middle, move the platforms.
for (int i = 0; i < platformCount; i++) {
if (platform[i].getVisibility() == true) {
platform[i].setY(platform[i].getY() - 8);
}
}
} else {
// or just move the guy if not.
guy.moveY(8);
}
} else {
onGround = true;
}
} else {
if (canExecuteMovement(0, -12)) {
if (guy.getY() < this.getParent().getHeight() / 2 - 100) {
// if you are in the middle, move the platforms.
for (int i = 0; i < platformCount; i++) {
if (platform[i].getVisibility() == true) {
platform[i].setY(platform[i].getY() + 12);
}
}
} else {
// or just move the guy if not.
guy.moveY(-12);
}
jumpCount++;
if (jumpCount >= 20) {
jumpCount = 0;
guy.setJumpState(false);
}
} else {
jumpCount = 0;
guy.setJumpState(false);
}
}
Код для перемещения влево и вправо:
if (guy.getDirection() == "left") {
if (canExecuteMovement(-4, 0)) {
if (guy.getX() < this.getParent().getWidth() / 2) {
// if you are in the middle, move the platforms.
for (int i = 0; i < platformCount; i++) {
if (platform[i].getVisibility() == true) {
platform[i].setX(platform[i].getX() + 4);
}
}
} else {
// or just move the guy if not.
guy.moveX(-4);
}
}
} else if (guy.getDirection() == "right") {
if (canExecuteMovement(4, 0)) {
if (guy.getX() > this.getParent().getWidth() / 2) {
// if you are in the middle, move the platforms.
for (int i = 0; i < platformCount; i++) {
if (platform[i].getVisibility() == true) {
platform[i].setX(platform[i].getX() - 4);
}
}
} else {
// or just move the guy if not.
guy.moveX(4);
}
}
}
А вот функция canExecuteMovement:
private boolean canExecuteMovement(int xChange, int yChange) {
int projectedX = guy.getX() + xChange;
int projectedY = guy.getY() + yChange;
Rectangle projectedBounds = new Rectangle(projectedX, projectedY, guy.getWidth(), guy.getHeight());
for (int i = 0; i < platformCount; i++) {
if (projectedBounds.intersects(platform[i].getBounds()) && platform[i].getVisibility() == true) {
return false;
}
}
return true;
}
Я действительно не знаю, как решить эту проблему, надеюсь, я смогу достичь просветления.