2016-11-16 1 views
2

Я очень новичок в javafx (и вообще программировании), поэтому приношу извинения за любое уродство. Я хочу сделать квадратное перемещение по окну, но не за один ход. Я хочу, чтобы двигаться в коротких последовательных участков, что у меня есть выглядит примерно так:Как сделать квадратное движение в коротких последовательных отрезках?

Rectangle rect = new Rectangle(0, 0, 10, 10); 
TranslateTransition tt = new TranslateTransition(new Duration(1000), sq); 
tt.setToX(1); 
tt.setCycleCount(Timeline.INDEFINITE); 
tt.playFromStart(); 

Моя проблема заключается в том, что он просто движется вперед, а затем возвращается в исходное положение снова. Я уверен, что у меня есть, чтобы один из них где-то

sq.setX(sq.getX() + sq.getTranslateX()); 
sq.setTranslateX(0); 

, но я не могу понять, куда его поставить. Спасибо за помощь!

+0

Didnt хорошо понимал, как это движение, которое вы хотите –

ответ

0

Итак, проблема (из того, что я вижу) заключается в том, что вы вызываете tt.setCycleCount(Timeline.INDEFINITE);, что приводит к тому, что анимация повторяется бесконечно. Установите его на tt.setCycleCount(1);, чтобы он запускался один раз, заканчивая квадратом, на котором он остановился.

2

Есть несколько способов сделать это, вот пара:

  1. Используйте SequentialTransition, состоящий из нескольких TranslateTransitions, которые перемежаются с PauseTransitions.
  2. Настройте Timeline, который манипулирует значением перевода квадрата с помощью серии KeyValues.

В приведенном ниже примере используется метод SequentialTransition:

step1 step2

import javafx.animation.*; 
import javafx.application.Application; 
import javafx.scene.*; 
import javafx.scene.paint.Color; 
import javafx.scene.shape.Rectangle; 
import javafx.stage.Stage; 
import javafx.util.Duration; 

public class EyeOfSauron extends Application { 
    private static final int N_STEPS = 5; 
    private static final int SQUARE_SIZE = 10; 
    private static final int STEP = SQUARE_SIZE * 2; 

    @Override public void start(Stage stage) { 
     Rectangle rect = new Rectangle(0, 0, SQUARE_SIZE, SQUARE_SIZE); 
     rect.setFill(Color.DARKRED); 

     SequentialTransition sequentialTransition = new SequentialTransition(); 
     for (int i = 0; i < N_STEPS; i++) { 
      PauseTransition pt = new PauseTransition(Duration.millis(250)); 
      TranslateTransition tt = new TranslateTransition(Duration.millis(500), rect); 
      tt.setByX(STEP); 
      tt.setInterpolator(Interpolator.LINEAR); 

      sequentialTransition.getChildren().addAll(
        pt, tt 
      ); 
     } 
     sequentialTransition.getChildren().add(new PauseTransition(Duration.millis(250))); 
     sequentialTransition.setAutoReverse(true); 
     sequentialTransition.setCycleCount(Transition.INDEFINITE); 

     stage.setScene(
       new Scene(
         new Group(rect), 
         N_STEPS * STEP + SQUARE_SIZE, 
         SQUARE_SIZE, 
         Color.BISQUE 
       ) 
     ); 
     stage.show(); 

     sequentialTransition.playFromStart(); 
    } 

    public static void main(String[] args) { launch(args); } 
} 
Смежные вопросы