diff --git a/pom.xml b/pom.xml index 6a922506d20f676dda22a51fffc6296c71f48044..a614662a9e8bb4e1d690a19479b3a999297128f2 100644 --- a/pom.xml +++ b/pom.xml @@ -22,26 +22,36 @@ <artifactId>javafx-fxml</artifactId> <version>23</version> </dependency> - <!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api --> + <!-- + https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api --> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> <version>5.11.0</version> <scope>test</scope> </dependency> - <!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-engine --> + <!-- + https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-engine --> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-engine</artifactId> <version>5.11.0</version> <scope>test</scope> </dependency> - <!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-params --> + <!-- + https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-params --> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-params</artifactId> <version>5.11.0</version> <scope>test</scope> </dependency> + <!-- https://mvnrepository.com/artifact/org.reflections/reflections --> + <dependency> + <groupId>org.reflections</groupId> + <artifactId>reflections</artifactId> + <version>0.10.2</version> + </dependency> + </dependencies> </project> diff --git a/src/main/java/lab/App.java b/src/main/java/lab/App.java index 3a9e838f99d4c9e57926a33c1d4ffe23ef873f42..58fd3f37f039d8171036be098a809c2ee811ccd6 100644 --- a/src/main/java/lab/App.java +++ b/src/main/java/lab/App.java @@ -9,22 +9,24 @@ import javafx.stage.Stage; import javafx.stage.WindowEvent; /** - * Class <b>App</b> - extends class Application and it is an entry point of the program - * @author Java I + * Class <b>App</b> - extends class Application and it is an entry point of the + * program + * + * @author Java I */ public class App extends Application { public static void main(String[] args) { launch(args); } - + private Canvas canvas; private AnimationTimer timer; - + @Override public void start(Stage primaryStage) { try { - //Construct a main window with a canvas. + // Construct a main window with a canvas. Group root = new Group(); canvas = new Canvas(800, 400); root.getChildren().add(canvas); @@ -34,8 +36,8 @@ public class App extends Application { primaryStage.resizableProperty().set(false); primaryStage.setTitle("Java 1 - 1th laboratory"); primaryStage.show(); - - //Exit program when main window is closed + + // Exit program when main window is closed primaryStage.setOnCloseRequest(this::exitProgram); timer = new DrawingThread(canvas); timer.start(); @@ -43,12 +45,13 @@ public class App extends Application { e.printStackTrace(); } } + @Override public void stop() throws Exception { timer.stop(); super.stop(); } - + private void exitProgram(WindowEvent evt) { System.exit(0); } diff --git a/src/main/java/lab/Background.java b/src/main/java/lab/Background.java new file mode 100644 index 0000000000000000000000000000000000000000..0db811c48d6bac135348fe60e5c3c6ed6847df36 --- /dev/null +++ b/src/main/java/lab/Background.java @@ -0,0 +1,56 @@ +package lab; + +import javafx.geometry.Point2D; +import javafx.scene.canvas.GraphicsContext; +import javafx.scene.image.Image; +import javafx.scene.paint.Color; + +public class Background { + + private Scene scene; + private Point2D[] imagePosition; + private Image[] image; + private Point2D speed; + private static final double[] speedMultiplier = new double[] { 0.6, 0.8, 1, 1 }; + + public Background(Scene scene) { + this.scene = scene; + image = new Image[4]; + imagePosition = new Point2D[4]; + image[0] = new Image(Background.class.getResourceAsStream("cityfar400.png")); + image[1] = new Image(Background.class.getResourceAsStream("citymid400.png")); + image[2] = new Image(Background.class.getResourceAsStream("cityclose400.png")); + image[3] = new Image(Background.class.getResourceAsStream("cityreflection400.png")); + imagePosition[0] = new Point2D(0, image[0].getHeight() - scene.getSize().getHeight()); + imagePosition[1] = new Point2D(0, image[1].getHeight() - scene.getSize().getHeight()); + imagePosition[2] = new Point2D(0, image[2].getHeight() - scene.getSize().getHeight()); + imagePosition[3] = new Point2D(0, image[3].getHeight() - scene.getSize().getHeight()); + speed = new Point2D(100, 0); + } + + public void draw(GraphicsContext gc) { + gc.setFill(Color.DARKBLUE); + gc.fillRect(0, 0, scene.getSize().getWidth(), scene.getSize().getHeight()); + for (int i = 0; i < image.length; i++) { + double w = scene.getSize().getWidth(); + double x = imagePosition[i].getX(); + double realWidth = x + w <= image[i].getWidth() ? w : image[i].getWidth() - x; + gc.drawImage(image[i], x, imagePosition[i].getY(), realWidth, scene.getSize().getHeight(), 0, 0, realWidth, + scene.getSize().getHeight()); + if (x + w > image[i].getWidth()) { + gc.drawImage(image[i], 0, imagePosition[i].getY(), w - realWidth, scene.getSize().getHeight(), + image[i].getWidth() - imagePosition[i].getX(), 0, w - realWidth, scene.getSize().getHeight()); + } + } + } + + public void simulate(double deltaTime) { + Point2D baseSpeed = speed.multiply(deltaTime / 1_000_000_000); + for (int i = 0; i < image.length; i++) { + imagePosition[i] = imagePosition[i].add(baseSpeed.multiply(speedMultiplier[i])); + if (imagePosition[i].getX() > image[i].getWidth()) { + imagePosition[i] = new Point2D(0, imagePosition[i].getY()); + } + } + } +} diff --git a/src/main/java/lab/Boat.java b/src/main/java/lab/Boat.java new file mode 100644 index 0000000000000000000000000000000000000000..ceafc8c658e705d44556c73000781e6cfcae176b --- /dev/null +++ b/src/main/java/lab/Boat.java @@ -0,0 +1,26 @@ +package lab; + +import javafx.geometry.Point2D; +import javafx.scene.canvas.GraphicsContext; +import javafx.scene.image.Image; + +public class Boat { + + private Scene scene; + private Point2D position; + private Image image; + + public Boat(Scene scene, Point2D position) { + this.scene = scene; + this.position = position; + image = new Image(Boat.class.getResourceAsStream("ship-boat.gif")); + } + + public void draw(GraphicsContext gc) { + gc.drawImage(image, position.getX(), position.getY()); + } + + public void simulate(double deltaTime) { + } + +} diff --git a/src/main/java/lab/DrawingThread.java b/src/main/java/lab/DrawingThread.java index 1243331c3822cf37a2932e9e8eeb8f336e3de58d..ccf2018447fd23b465db160f0f853374d0aa74de 100644 --- a/src/main/java/lab/DrawingThread.java +++ b/src/main/java/lab/DrawingThread.java @@ -3,16 +3,23 @@ package lab; import javafx.animation.AnimationTimer; import javafx.scene.canvas.Canvas; import javafx.scene.canvas.GraphicsContext; +import javafx.scene.paint.Color; public class DrawingThread extends AnimationTimer { private final Canvas canvas; private final GraphicsContext gc; + private Scene scene; + private long lastSecond = 0;; + private int frameCount = 0; + private int fps = 0; + private long lastTime; public DrawingThread(Canvas canvas) { this.canvas = canvas; this.gc = canvas.getGraphicsContext2D(); - + scene = new Scene(canvas.getWidth(), canvas.getHeight()); + lastSecond = System.nanoTime(); } /** @@ -20,11 +27,22 @@ public class DrawingThread extends AnimationTimer { */ @Override public void handle(long now) { - // put your code here -// gc.setFill(Color.AQUA); -// gc.setStroke(Color.BLACK); -// gc.fillOval(10, 10, 20, 20); - + long timeDelta = now - lastTime; + scene.draw(gc); + scene.simulate(timeDelta); + long currentSecond = now / 1_000_000_000; + if(lastSecond == currentSecond) { + frameCount ++; + } else { + lastSecond = currentSecond; + fps = frameCount; + frameCount = 0; + } + lastTime = now; + //print FPS + gc.setStroke(Color.RED); + gc.strokeText(Integer.toString(fps), 10, 30); + gc.strokeText(Double.toString(1_000_000_000d/timeDelta), 10, 50); } } diff --git a/src/main/java/lab/Rock.java b/src/main/java/lab/Rock.java new file mode 100644 index 0000000000000000000000000000000000000000..50c9db636a516bb58fa535d74c8cad99eb838a79 --- /dev/null +++ b/src/main/java/lab/Rock.java @@ -0,0 +1,43 @@ +package lab; + +import javafx.geometry.Dimension2D; +import javafx.geometry.Point2D; +import javafx.scene.canvas.GraphicsContext; +import javafx.scene.paint.Color; +import javafx.scene.transform.Affine; +import javafx.scene.transform.Rotate; + +public class Rock { + + private Scene scene; + private Point2D position; + private Dimension2D size; + private double angle = 0; + + public Rock(Scene scene) { + this(scene, new Point2D(350, 200), new Dimension2D(60, 10)); + } + + public Rock(Scene scene, Point2D position, Dimension2D size) { + this.scene = scene; + this.position = position; + this.size = size; + } + + public void draw(GraphicsContext gc) { + gc.save(); + gc.setFill(Color.GRAY); + gc.setStroke(Color.GREEN); + Point2D center = position.add(size.getWidth()/2, size.getHeight()/2); + Rotate rotateMatrix = Affine.rotate(angle, center.getX(), center.getY()); + gc.setTransform(new Affine(rotateMatrix)); + gc.fillRect(position.getX(), position.getY(), size.getWidth(), size.getHeight()); + gc.strokeRect(position.getX(), position.getY(), size.getWidth(), size.getHeight()); + gc.restore(); + } + + public void simulate(double deltaTime) { + angle += 0.5; + } + +} diff --git a/src/main/java/lab/Scene.java b/src/main/java/lab/Scene.java new file mode 100644 index 0000000000000000000000000000000000000000..6b4a4ea2e5481474905f152d1e442371469f35b2 --- /dev/null +++ b/src/main/java/lab/Scene.java @@ -0,0 +1,37 @@ +package lab; + +import javafx.geometry.Dimension2D; +import javafx.geometry.Point2D; +import javafx.scene.canvas.GraphicsContext; + +public class Scene { + + private Dimension2D size; + private Background background; + private Rock rock; + private Boat boat; + + public Scene(double width, double height) { + size = new Dimension2D(width, height); + background = new Background(this); + rock = new Rock(this, new Point2D(300, 300), new Dimension2D(30, 50)); + boat = new Boat(this, new Point2D(20, 200)); + } + + public Dimension2D getSize() { + return size; + } + +public void draw(GraphicsContext gc) { + background.draw(gc); + rock.draw(gc); + boat.draw(gc); +} + + public void simulate(double deltaTime) { + background.simulate(deltaTime); + rock.simulate(deltaTime); + boat.simulate(deltaTime); + } + +} diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java index 736971c46e3a0601a2db674231080b0e8f886cc0..de0ed33a8ead600abe26ae2fddabc73a762d4fc5 100644 --- a/src/main/java/module-info.java +++ b/src/main/java/module-info.java @@ -2,6 +2,7 @@ module lab01 { requires transitive javafx.controls; requires javafx.fxml; requires javafx.base; + requires org.reflections; opens lab to javafx.fxml; exports lab; } \ No newline at end of file diff --git a/src/main/resources/lab/cityclose400.png b/src/main/resources/lab/cityclose400.png new file mode 100644 index 0000000000000000000000000000000000000000..87b9f127ba8d657380012444e4af100a8390f448 Binary files /dev/null and b/src/main/resources/lab/cityclose400.png differ diff --git a/src/main/resources/lab/cityfar400.png b/src/main/resources/lab/cityfar400.png new file mode 100644 index 0000000000000000000000000000000000000000..52cff17aacf2047c237e341b5d158c463bb65e43 Binary files /dev/null and b/src/main/resources/lab/cityfar400.png differ diff --git a/src/main/resources/lab/citymid400.png b/src/main/resources/lab/citymid400.png new file mode 100644 index 0000000000000000000000000000000000000000..4515bc540d03a1631cdc9507379a27e01f6698fb Binary files /dev/null and b/src/main/resources/lab/citymid400.png differ diff --git a/src/main/resources/lab/cityreflection400.png b/src/main/resources/lab/cityreflection400.png new file mode 100644 index 0000000000000000000000000000000000000000..44ffabc01edffc89e5f47e1de5f9a1501061c37c Binary files /dev/null and b/src/main/resources/lab/cityreflection400.png differ diff --git a/src/main/resources/lab/ship-boat.gif b/src/main/resources/lab/ship-boat.gif new file mode 100644 index 0000000000000000000000000000000000000000..2e64cdf9cefbf5a73a17b9b6fd5507c3d1d077a1 Binary files /dev/null and b/src/main/resources/lab/ship-boat.gif differ