Правя прототипа на игра, която се опитвам да направя с 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();
}
});
}