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)


И така, реших собствения си проблем (?). Открих, че тези PathElements използват координати, които са спрямо текущата позиция на възела и че трансформациите са базирани на центъра на възела. Така че, за да може моят спрайт да скочи напред, моята CubicCurveTo трябваше да има отрицателни y-координати на двете контролни точки. Що се отнася до частта, в която моят спрайт скача, защото е центриран в посочената точка (тъй като стойностите на координатите на ImageView се отнасят до техния произход, т.е. горния ляв ъгъл на ограничителната кутия, ако не греша), ще трябва да поработя около това за сега. Поне отстраних най-големия проблем.

Чудя се обаче дали има някаква документация, в която се казва, че PathElements използва относителната позиция на възела, за да го премести.

person welpp    schedule 18.03.2020