From 9e34e06549e6d192855097cb476ba1ed70bd31b6 Mon Sep 17 00:00:00 2001 From: jez04 <david.jezek@post.cz> Date: Thu, 10 Oct 2024 10:48:35 +0200 Subject: [PATCH] feat: solution --- src/main/java/lab/Boat.java | 6 ++++ src/main/java/lab/DrawingThread.java | 4 +-- src/main/java/lab/LochNess.java | 50 +++++++++++++++++++++++++++ src/main/java/lab/Rock.java | 2 +- src/main/java/lab/Scene.java | 34 ++++++++++++------ src/main/resources/lab/LochNess.gif | Bin 0 -> 2306 bytes 6 files changed, 83 insertions(+), 13 deletions(-) create mode 100644 src/main/java/lab/LochNess.java create mode 100644 src/main/resources/lab/LochNess.gif diff --git a/src/main/java/lab/Boat.java b/src/main/java/lab/Boat.java index ceafc8c..574c194 100644 --- a/src/main/java/lab/Boat.java +++ b/src/main/java/lab/Boat.java @@ -1,6 +1,7 @@ package lab; import javafx.geometry.Point2D; +import javafx.geometry.Rectangle2D; import javafx.scene.canvas.GraphicsContext; import javafx.scene.image.Image; @@ -18,9 +19,14 @@ public class Boat { public void draw(GraphicsContext gc) { gc.drawImage(image, position.getX(), position.getY()); + gc.strokeRect(position.getX(), position.getY(), image.getWidth(), image.getHeight()); } public void simulate(double deltaTime) { } + public Rectangle2D getBoundingBox() { + return new Rectangle2D(position.getX(), position.getY(), image.getWidth(), image.getHeight()); + } + } diff --git a/src/main/java/lab/DrawingThread.java b/src/main/java/lab/DrawingThread.java index ccf2018..56c94df 100644 --- a/src/main/java/lab/DrawingThread.java +++ b/src/main/java/lab/DrawingThread.java @@ -10,16 +10,16 @@ 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; + private long lastSecond = 0; public DrawingThread(Canvas canvas) { this.canvas = canvas; this.gc = canvas.getGraphicsContext2D(); scene = new Scene(canvas.getWidth(), canvas.getHeight()); - lastSecond = System.nanoTime(); + lastTime = System.nanoTime(); } /** diff --git a/src/main/java/lab/LochNess.java b/src/main/java/lab/LochNess.java new file mode 100644 index 0000000..e27d7e0 --- /dev/null +++ b/src/main/java/lab/LochNess.java @@ -0,0 +1,50 @@ +package lab; + +import java.util.Random; + +import javafx.geometry.Point2D; +import javafx.geometry.Rectangle2D; +import javafx.scene.canvas.GraphicsContext; +import javafx.scene.image.Image; + +public class LochNess { + + private static final Random RANDOM = new Random(); + + private Scene scene; + private Point2D position; + private Point2D speed; + private Image image; + + public LochNess(Scene scene) { + this.scene = scene; + image = new Image(LochNess.class.getResourceAsStream("LochNess.gif")); + position = new Point2D(RANDOM.nextDouble(scene.getSize().getWidth() * 0.3, scene.getSize().getWidth()), + RANDOM.nextDouble(scene.getSize().getHeight() * 0.5, scene.getSize().getHeight() - image.getHeight())); + speed = new Point2D(-RANDOM.nextDouble(50, 150), 0); + } + + public void draw(GraphicsContext gc) { + gc.drawImage(image, position.getX(), position.getY()); + gc.strokeRect(position.getX(), position.getY(), image.getWidth(), image.getHeight()); + } + + public void simulate(double deltaTime) { + position = position.add(speed.multiply(deltaTime / 1_000_000_000)); + if (position.getX() + image.getWidth() < 0) { + position = new Point2D(scene.getSize().getWidth(), position.getY()); + } + if (position.getX() > scene.getSize().getWidth()+5) { + position = new Point2D(scene.getSize().getWidth(), position.getY()); + speed = speed.multiply(-1); + } + } + + public Rectangle2D getBoundingBox() { + return new Rectangle2D(position.getX(), position.getY(), image.getWidth(), image.getHeight()); + } + + public void changeDirection() { + speed = speed.multiply(-1); + } +} diff --git a/src/main/java/lab/Rock.java b/src/main/java/lab/Rock.java index 50c9db6..b5a1b43 100644 --- a/src/main/java/lab/Rock.java +++ b/src/main/java/lab/Rock.java @@ -28,7 +28,7 @@ public class Rock { gc.save(); gc.setFill(Color.GRAY); gc.setStroke(Color.GREEN); - Point2D center = position.add(size.getWidth()/2, size.getHeight()/2); + 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()); diff --git a/src/main/java/lab/Scene.java b/src/main/java/lab/Scene.java index 6b4a4ea..eaf6e25 100644 --- a/src/main/java/lab/Scene.java +++ b/src/main/java/lab/Scene.java @@ -10,28 +10,42 @@ public class Scene { private Background background; private Rock rock; private Boat boat; - + private LochNess[] lochNesses; + 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)); + lochNesses = new LochNess[5]; + for (int i = 0; i < lochNesses.length; i++) { + lochNesses[i] = new LochNess(this); + } } public Dimension2D getSize() { return size; - } - -public void draw(GraphicsContext gc) { - background.draw(gc); - rock.draw(gc); - boat.draw(gc); -} - + } + + public void draw(GraphicsContext gc) { + background.draw(gc); + rock.draw(gc); + boat.draw(gc); + for (LochNess lochNess : lochNesses) { + lochNess.draw(gc); + } + } + public void simulate(double deltaTime) { background.simulate(deltaTime); rock.simulate(deltaTime); boat.simulate(deltaTime); + for (LochNess lochNess : lochNesses) { + lochNess.simulate(deltaTime); + if (lochNess.getBoundingBox().intersects(boat.getBoundingBox())) { + lochNess.changeDirection(); + } + } } - + } diff --git a/src/main/resources/lab/LochNess.gif b/src/main/resources/lab/LochNess.gif new file mode 100644 index 0000000000000000000000000000000000000000..ba24b711a5a146c0410097afe8014ac0fdb75748 GIT binary patch literal 2306 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 GSp6S5h<qFX literal 0 HcmV?d00001 -- GitLab