Язык программирования:
Java
Среда программирования:
IntelliJ IDEA 2016.1
package me.grafika.barbanyagra; import javafx.animation.*; import javafx.application.Application; import javafx.scene.Group; import javafx.scene.Scene; import javafx.scene.paint.Color; import javafx.scene.shape.Circle; import javafx.scene.shape.LineTo; import javafx.scene.shape.MoveTo; import javafx.scene.shape.Path; import javafx.stage.Stage; import javafx.util.Duration; import static java.lang.Math.ceil; import static java.lang.Math.sqrt; public class RandomMoveDots extends Application { private static final double EXTERNAL_RADIUS = 13; // радиус невидимых внешних кругов (по нему происходит размещение окружностей) private static final double INNER_RADIUS = 8; // радиус видимых округов private static final double MOVEMENT_MS = 250; // продолжительность движения private static final double PAUSE_MS = 150; // продолжительность паузы между движениями @Override public void start(Stage primaryStage) throws Exception { Group root = new Group(); primaryStage.setScene(new Scene(root, 500, 500, Color.BLACK)); // задаем сцену primaryStage.setResizable(false); // запрещаем изменять размер экрана primaryStage.setTitle("Random Move Dots"); // задаем заголовок она Group circles = new Group(); // сюда сложим круги ParallelTransition animation = new ParallelTransition(); // сюда сложим всю анимацию // по радиусу вычисляем достаточное количество кругов int in_raw = (int) ceil(500 / EXTERNAL_RADIUS) / 2 + 1; int in_column = (int) ceil(500 / sqrt(3) / EXTERNAL_RADIUS) / 2 + 1; for (int i = -in_column; i <= in_column; i++) { for (int j = -in_raw; j <= in_raw; j++) { Circle circle = new Circle(getX(i, j), getY(i, j), INNER_RADIUS, Color.WHITE); // создаем круг circles.getChildren().add(circle); // добавляем круг SequentialTransition st = new SequentialTransition(); // создаем последовательную анимацию st.getChildren().addAll( // движение в сторону new PathTransition( Duration.millis(MOVEMENT_MS), new Path( new MoveTo(getX(i, j), getY(i, j)), new LineTo(getX(i, j + (i % 2 == 0 ? 1 : -1)), getY(i, j + (i % 2 == 0 ? 1 : -1))) ), circle), new PauseTransition(Duration.millis(PAUSE_MS)), // пауза // движение влево new PathTransition( Duration.millis(MOVEMENT_MS), new Path( new MoveTo(getX(i, j), getY(i, j)), new LineTo(getX(i + (j % 2 == 0 ? 1 : -1), j), getY(i + (j % 2 == 0 ? 1 : -1), j)) ), circle), new PauseTransition(Duration.millis(PAUSE_MS)), // пауза // движение вправо new PathTransition( Duration.millis(MOVEMENT_MS), new Path( new MoveTo(getX(i, j), getY(i, j)), new LineTo(getX(i - ((i + j) % 2 == 0 ? 1 : -1), j + ((i + j) % 2 == 0 ? 1 : -1)), getY(i - ((i + j) % 2 == 0 ? 1 : -1), j + ((i + j) % 2 == 0 ? 1 : -1))) ), circle), new PauseTransition(Duration.millis(PAUSE_MS)) // пауза ); st.setCycleCount(Animation.INDEFINITE); // зацикливаем animation.getChildren().add(st); // сохраняем } } root.getChildren().add(circles); // добавляем круги primaryStage.show(); // запускаем сцену animation.play(); // запускаем анимацию } private double getX(double x, double y) { return 250 + x * EXTERNAL_RADIUS + y * 2 * EXTERNAL_RADIUS; } private double getY(double x, double y) { return 250 + x * sqrt(3) * EXTERNAL_RADIUS; } }
Прикрепленный файл | Размер |
---|---|
RandomMoveDots.zip | 40.28 кб |