Я пытаюсь реализовать LEFT RIGHT движение прямоугольной формы в JavaFX. Ниже мой код:Как получить гладкую анимацию с событием KeyPress в javaFX?
public void start(Stage primaryStage) throws Exception {
AnchorPane ancPane = new AnchorPane();
final Rectangle rect = new Rectangle();
rect.setHeight(50);
rect.setWidth(50);
ancPane.getChildren().add(rect);
Scene scene = new Scene(ancPane, 400, 200, Color.GREEN);
primaryStage.setScene(scene);
primaryStage.show();
scene.setOnKeyPressed(new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent keyEvent) {
System.out.println("hello");
if(keyEvent.getCode().toString() == "RIGHT"){
System.out.println("Move Right");
TranslateTransition translateTransitionRight = new TranslateTransition();
translateTransitionRight.setDuration(Duration.millis(200));
translateTransitionRight.setNode(rect);
translateTransitionRight.setFromX(rect.getTranslateX());
translateTransitionRight.setToX(rect.getTranslateX()+30);
translateTransitionRight.play();
}
if(keyEvent.getCode().toString() == "LEFT"){
System.out.println("Move Left");
TranslateTransition translateTransitionRight = new TranslateTransition();
translateTransitionRight.setDuration(Duration.millis(200));
translateTransitionRight.setNode(rect);
translateTransitionRight.setFromX(rect.getTranslateX());
translateTransitionRight.setToX(rect.getTranslateX()-30);
translateTransitionRight.play();
}
}
});
}
Вот когда я нажимаю либо влево/вправо непрерывно (т.е. я не выпустил ключ, я держу его в несколько раз) в прямоугольник движется, но не постоянно. Он приостанавливается в течение небольшой части времени сразу после начала анимации. После паузы анимация продолжается гладко.
Как я могу избавиться от этой приостановки анимации с помощью KeyEvents?
Одна из приятных (но, возможно, не очевидных) особенностей этого подхода заключается в том, что у вас есть полный программный контроль над скоростью прямоугольника; это не определяется настройками уровня ОС, такими как частота повторения клавиатуры и т. д. –
Привет, Джеймс, в начале анимации все еще есть пауза, когда я поочередно нажимаю клавишу LEFT/RIGHT. Также не могли бы вы дать некоторое объяснение логике, которую вы здесь реализуете. – Angom
С некоторым анализом я могу понять логику. Кроме того, я сделал небольшую модификацию внутри scene.setOnKeyReleased(), чтобы установить rectangleVelocity в 0 только тогда, когда выпущены обе кнопки LEFT/RIGHT, иначе это вызовет эффект паузы в анимации. Благодарю. – Angom