Повторите PathTransition несколько раз - PullRequest
0 голосов
/ 20 сентября 2018

Я пытаюсь создать программу, которая случайным образом перемещает несколько кругов на моей границе.Я создал метод, в котором мои круги следуют по пути произвольной линии на моей панели.Я делаю это через PathTransition.Они следуют линии и поэтому двигаются.Но когда они достигают конца своего перехода, они останавливаются ... Я хочу, чтобы они переместились в другую случайную позицию, чтобы они перемещались случайным образом по панели.

Здесь я создаю и добавляю круги со случайным цветом,в случайной позиции на моей границе:

//Creating an array of circles and fill them
    Random random = new Random();
    Circle circles[] = new Circle[20];
    for (int i = 0; i < 20; i++) {
        circles[i] = new Circle();
        circles[i].setRadius(30);
    }

    //Adding circles to pane on random position and give them random collers
    for (int i = 0; i < 20; i++) {
        Random randon = new Random();
        int randX = randon.nextInt((int) borderPane.getWidth() - 30);
        int randY = randon.nextInt((int) borderPane.getHeight() - 30);

        int rColor = 20 + randon.nextInt(235);
        int gColor = 20 + randon.nextInt(235);
        int bColor = 20 + randon.nextInt(235);

        borderPane.getChildren().add(circles[i]);
        circles[i].setCenterX(randX);
        circles[i].setCenterY(randY);
        circles[i].setFill(Color.rgb(rColor, gColor, bColor));
    }

Вот метод, который заставляет их двигаться:

public void MoveCircles(BorderPane borderPane,Circle circles[]){
    for (int i = 0; i < 20; i++) {
        Random random = new Random();
        int endPosX = random.nextInt((int) borderPane.getWidth() - 30);
        int endPosY = random.nextInt((int) borderPane.getHeight() - 30);

        Line line2 = new Line(circles[i].getCenterX(), circles[i].getCenterY(), endPosX, endPosY);
        PathTransition pathTransition2 = new PathTransition();
        pathTransition2.setNode(circles[i]);
        pathTransition2.setDuration(Duration.seconds(2));
        pathTransition2.setPath(line2);
        pathTransition2.play();
    }
}

Здесь я вызываю метод:

MoveCircles(borderPane,circles);

IЯ пытался повторить метод в цикле, но это не работает.Они просто двигаются один раз и останавливаются.Как я могу заставить метод повторяться снова и снова, чтобы круги продолжали двигаться.Ты заранее:)

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

В качестве альтернативы SequentialTransition вы можете использовать метод setOnFinished класса PathTransition.Этот метод вызывается после завершения анимации.Здесь вы можете установить новый путь и запустить анимацию снова.

Используя метод setOnFinished, метод MoveCircles становится:

public void MoveCircles(BorderPane borderPane,Circle circles[]){
    for (int i = 0; i < 20; i++) {
        PathTransition pathTransition2 = new PathTransition();
        pathTransition2.setNode(circles[i]);
        pathTransition2.setDuration(Duration.seconds(2));
        pathTransition2.setPath(createPath(borderPane, pathTransition2));       
        pathTransition2.play();
        pathTransition2.setInterpolator(Interpolator.LINEAR);               
        pathTransition2.setOnFinished(e -> {                        
            pathTransition2.setPath(createPath(borderPane, pathTransition2));   
            pathTransition2.play();                         
        });                                     
    }
}

Поскольку создание пути используется дважды, имеет смысл перенести функциональность в отдельный метод, например,

private Line createPath(BorderPane borderPane, PathTransition pathTransition) {
    Circle circle = (Circle)pathTransition.getNode();
    Line line = (Line)pathTransition.getPath();
    Random random = new Random();
    int endPosX = random.nextInt((int) borderPane.getWidth() - 30);
    int endPosY = random.nextInt((int) borderPane.getHeight() - 30);
    return new Line(line == null ? circle.getCenterX() : line.getEndX(), line == null ? circle.getCenterY() : line.getEndY(), endPosX, endPosY); // without discontinuities
    // return new Line(circle.getCenterX(), circle.getCenterY(), endPosX, endPosY); // with discontinuities
}

Поскольку вторым параметром метода createPath является сам pathTransition, можно легко использовать конечную точку предыдущего пути в качестве начальной точки следующего пути, что позволяет избежать разрывов в последовательных последовательностях движения.Но это, конечно, необязательно.

0 голосов
/ 20 сентября 2018

Когда вы вызываете метод анимации play(), анимация начинает воспроизводиться в фоновом режиме.Поэтому, если вы создаете и запускаете несколько анимаций, затрагивающих один и тот же Узел, все они запускаются примерно в одно и то же время и мешают друг другу.

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

public void moveCircles(BorderPane borderPane, Circle circles[]) {

    // Better to create one Random and keep using it to generate random values.
    Random random = new Random();

    int repeatCount = 5;

    for (int i = 0; i < circles.length; i++) {

        SequentialTransition sequence = new SequentialTransition();

        for (int r = 0; r < repeatCount; r++) {
            int endPosX = random.nextInt((int) borderPane.getWidth() - 30);
            int endPosY = random.nextInt((int) borderPane.getHeight() - 30);

            Line line2 = new Line(circles[i].getCenterX(), circles[i].getCenterY(), endPosX, endPosY);
            PathTransition pathTransition2 = new PathTransition();
            pathTransition2.setNode(circles[i]);
            pathTransition2.setDuration(Duration.seconds(2));
            pathTransition2.setPath(line2);
            sequence.getChildren().add(pathTransition2);
        }

        sequence.play();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...