PathTransition работает не так, как я думал (путаница с использованием CubicCurveTo/ArcTo и координат в целом)

Я делаю прототип игры, которую пытаюсь сделать с помощью JavaFX. Требуется, чтобы персонаж/спрайт двигался по изогнутой траектории вперед (в основном прыгал в определенную позицию вперед). Я попытался использовать MoveTo (используя значения layoutX и layoutY ImageView спрайта, жестко запрограммированные) с CubicCurveTo и ArcTo, чтобы указать этот путь, но затем спрайт прыгает и запускает анимацию из-под окна и просто выполняет анимация начинается с этой точки, хотя мой спрайт находится примерно в середине окна.

Я попытался установить для MoveTo значение 0, но затем спрайт переходит в немного другое положение рядом с его текущим положением (верхняя левая сторона спрайта), а затем выполняет анимацию до прошлого под окном. Насколько я понимаю, конечные координаты CubicCurveTo и ArcTo оставались одинаковыми независимо от того, где находится MoveTo.

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

Вот мой код (это внутри метода initialize() класса контроллера моего FXML):

/*
The root is a Pane with prefWidth = 960, prefHeight = 540
*/
public void initialize() {
    /*
    char1 is the ImageView of the sprite. layoutX = 270, layoutY = 290
    */
    char1.setScaleX(-1);

    final Path path = new Path();
    path.getElements().add(new MoveTo(0, 0));
    // these are rough numbers, based on the coordinate system that the layoutX and layoutY of the ImageView uses
    // path.getElements().add(new CubicCurveTo(300, 200, 400, 200, 500, 290));
    path.getElements().add(new ArcTo(100, 60, 40, 500, 290, true, true));

    final PathTransition pathTransition = new PathTransition();
    pathTransition.setDuration(Duration.millis(2000));
    pathTransition.setNode(char1);
    pathTransition.setPath(path);
    pathTransition.setCycleCount(1);
    pathTransition.setAutoReverse(true);

    jumpButton.setOnAction(new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent actionEvent) {
            pathTransition.play();
        }
    });
}

person welpp    schedule 15.03.2020    source источник


Ответы (1)


Итак, я решил свою проблему (?). Я обнаружил, что эти элементы пути используют координаты, которые относительны к текущему положению узла, и что преобразования основаны на центре узла. Итак, чтобы мой спрайт прыгал вперед, мой CubicCurveTo должен был иметь отрицательные координаты y на двух контрольных точках. Что касается части, где мой спрайт прыгает из-за того, что он центрирован в указанной точке (поскольку значения координат ImageView относятся к их происхождению, то есть к верхнему левому углу ограничивающей рамки, если я не ошибаюсь), мне придется работать вокруг этого на данный момент. По крайней мере, я решил самую большую проблему.

Однако мне интересно, есть ли какая-либо документация, в которой говорится, что PathElements использует относительное положение узла для его перемещения.

person welpp    schedule 18.03.2020