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