Как мне остановить мой игровой корабль от ускорения назад? - PullRequest
0 голосов
/ 04 октября 2019

У меня есть игра, в которой есть объект корабля (с полигонами JavaFX). Когда я перемещаю корабль своими ключами (через EventHandlers и AnimationTimers), он движется вверх. Когда я отпускаю его, он должен изменить ускорение на -4, и поэтому он постоянно отнимает -4 от скорости корабля до тех пор, пока он не достигнет 0. Однако, поскольку корабль может двигаться во всех направлениях, скорость иногда отрицательнакогда корабль движется вперед. Поэтому, когда я пытаюсь остановить корабль, когда скорость отрицательна, этого не происходит, и корабль продолжает двигаться назад.

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

Вот код для метода расчета скорости корабля x:

AnimationTimer calculateVelocityX = new AnimationTimer() {
        @Override
        public void handle(long now) {
            if (getAcceleration() == 17)
                setVelocityX(getVelocityX() + (Math.cos(Math.toRadians(getRotation())) * (getAcceleration() * 0.01)));
            else if (acceleration == -4)
                setVelocityX(getVelocityX() + (Math.cos(Math.toRadians(getTempRotation())) * (getAcceleration() * 0.01)));
        }
    };
    AnimationTimer shipAccelerationTimer = new AnimationTimer() {
        @Override
        public void handle(long now) {
            getShipImage().setLayoutX(getShipImage().getLayoutX() + getVelocityX());
            getShipImage().setLayoutY(getShipImage().getLayoutY() - getVelocityY());
            wrapShip();
            if (getVelocityX() == 0 && getVelocityY() == 0) {
                getCalculateVelocityX().stop();
                getCalculateVelocityY().stop();
                setAcceleration(17);
                setCounterOne(0);
                setCounterTwo(0);
                setCounterThree(0);
                getShipAccelerationTimer().stop();
            }
        }
    };

Этот код переместит корабль назад, так как скорости не могут фактически достичь 0 из-за десятичной точности,Однако, если я скажу, когда скорость меньше 0, это невозможно из того, что я сказал выше.

Изображение знаков скорости, когда груз перемещается в указанном направлении:

https://i.stack.imgur.com/5sxNi.png

Поэтому я не могу просто иметь «когда скорость меньше 0», поскольку, как и в квадрантах 2, 3, 4, я могу двигаться вперед, но иметь отрицательные скорости x, y или оба.

Ответы [ 2 ]

0 голосов
/ 04 октября 2019

Ускорение в обратном направлении не сработает, поскольку направление не является постоянным.

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

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

Кстати, я рекомендую не использовать 3 аннотации для изменения скорости здесь. Это просто делает ваш код излишне сложным. Вы можете сделать все это в одной анимации.

Пример:

(код прост, а не продуман)

@Override
public void start(Stage primaryStage) throws Exception {
    double w = 600;
    double h = 600;

    Rotate rotation = new Rotate(0, 0, 0);
    Line ship = new Line(0, 0, 20, 0);
    ship.getTransforms().add(rotation);

    ship.setLayoutX(w / 2);
    ship.setLayoutY(h / 2);

    Pane root = new Pane(ship);
    root.setPrefSize(w, h);

    class Animator extends AnimationTimer {
        // the current speed
        double vx;
        double vy;

        // the direction the ship is facing
        double directionX = 1;
        double directionY = 0;

        // the current acceleration magnitude
        double acceleration = 0;

        @Override
        public void handle(long now) {
            if (acceleration > 0) {
                // speed up in the direction the ship is currently facing
                vx += directionX * acceleration * 0.001;
                vy += directionY * acceleration * 0.001;

                acceleration -= 0.1;
            } else if (vx != 0 || vy != 0) {
                // decelerate
                double speed = Math.hypot(vx, vy);

                // constant deceleration opposite to velocity
                double correctionFactor = Math.max((speed - 0.01) / speed, 0);
                vx *= correctionFactor;
                vy *= correctionFactor;
            }

            // update position
            ship.setLayoutX(ship.getLayoutX() + vx);
            ship.setLayoutY(ship.getLayoutY() + vy);
        }

    }

    Animator animator = new Animator();
    animator.start();

    Scene scene = new Scene(root);

    // make sure the ship always faces the mouse
    root.setOnMouseMoved(evt -> {
        double dx = evt.getX() - ship.getLayoutX();
        double dy = evt.getY() - ship.getLayoutY();

        if (dx == 0 && dy == 0) {
            // handle special case of mouse being in the same position as the ship
            dx = 1;
        }

        // assign normalized direction
        double magnitude = Math.hypot(dx, dy);
        animator.directionX = dx / magnitude;
        animator.directionY = dy / magnitude;

        // update ship rotation
        rotation.setAngle(Math.toDegrees(Math.atan2(dy, dx)));
    });

    root.setOnMouseClicked(evt -> {
        // accelerate
        animator.acceleration = 17;
    });
    primaryStage.setScene(scene);
    primaryStage.show();
}
0 голосов
/ 04 октября 2019

Если бы я был в вас, я бы подумал о рассмотрении скорости с его величиной и направлением, где Величина> = 0 и направление ± 1 по сравнению с положительным X и положительным Y.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...