Игрок застревает в блоке иногда в 2d платформер - PullRequest
2 голосов
/ 26 января 2012

Я делаю 2d Platformer на Java, и по какой-то причине, когда игрок прыгает к платформе, он иногда застревает.Вот изображение проблемы:

enter image description here

Как вы видите, я прыгал на вершину платформы, но она застряла.

Вот мой код столкновения для падения / прыжка:

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

Я действительно не знаю, как решить эту проблему, надеюсь, я смогу достичь просветления.

1 Ответ

5 голосов
/ 26 января 2012

Вам необходимо отслеживать код разрешения / запрещения движения для x и y отдельно.Происходит следующее: если пользователь не может двигаться дальше вправо, код полностью его останавливает.Однако он ДОЛЖЕН быть в состоянии двигаться вверх или вниз.

Рассмотрите возможность разделения условий в вашем коде, чтобы при назначении новых векторов движения он устанавливал x и y по отдельности, проверяя возможность перехода в x и yв индивидуальном порядке.

...