From 7bb16461cbf51c6c1cfc0185985d087777852d98 Mon Sep 17 00:00:00 2001
From: jez04 <david.jezek@post.cz>
Date: Sat, 5 Oct 2024 01:42:10 +0200
Subject: [PATCH] feat: solution

---
 src/main/java/lab/DrawingThread.java |  13 ++++----
 src/main/java/lab/Level.java         |  39 ++++++++++++++++++++++++
 src/main/java/lab/NicerObstacle.java |  27 +++++++++++++++++
 src/main/java/lab/Obstacle.java      |  38 +++++++++++++++++++++++
 src/main/java/lab/Player.java        |  43 +++++++++++++++++++++++++++
 src/main/resources/lab/spike.gif     | Bin 0 -> 24413 bytes
 6 files changed, 154 insertions(+), 6 deletions(-)
 create mode 100644 src/main/java/lab/Level.java
 create mode 100644 src/main/java/lab/NicerObstacle.java
 create mode 100644 src/main/java/lab/Obstacle.java
 create mode 100644 src/main/java/lab/Player.java
 create mode 100644 src/main/resources/lab/spike.gif

diff --git a/src/main/java/lab/DrawingThread.java b/src/main/java/lab/DrawingThread.java
index 1243331..a53ad11 100644
--- a/src/main/java/lab/DrawingThread.java
+++ b/src/main/java/lab/DrawingThread.java
@@ -8,11 +8,14 @@ public class DrawingThread extends AnimationTimer {
 
 	private final Canvas canvas;
 	private final GraphicsContext gc;
+	private Level level;
+	private long lastTime;
 
 	public DrawingThread(Canvas canvas) {
 		this.canvas = canvas;
 		this.gc = canvas.getGraphicsContext2D();
-		
+		this.level = new Level(canvas.getWidth(), canvas.getHeight());
+		lastTime = System.nanoTime();
 	}
 
 	/**
@@ -20,11 +23,9 @@ 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);
-
+		level.draw(gc);
+		level.simulate(now - lastTime);
+		lastTime = now;
 	}
 
 }
diff --git a/src/main/java/lab/Level.java b/src/main/java/lab/Level.java
new file mode 100644
index 0000000..819c89f
--- /dev/null
+++ b/src/main/java/lab/Level.java
@@ -0,0 +1,39 @@
+package lab;
+
+import javafx.geometry.Dimension2D;
+import javafx.geometry.Point2D;
+import javafx.scene.canvas.GraphicsContext;
+import javafx.scene.paint.Color;
+
+public class Level {
+
+	private NicerObstacle nicerObstacle;
+	private Obstacle obstacle1;
+	private Obstacle obstacle2;
+	private Player player;
+	private double width;
+	private double height;
+
+	public Level(double width, double height) {
+		this.width = width;
+		this.height = height;
+		nicerObstacle = new NicerObstacle(this, new Point2D(20, 150));
+		obstacle1 = new Obstacle(this, new Point2D(300, 200), new Dimension2D(80, 40));
+		obstacle2 = new Obstacle(this);
+		player = new Player(this, new Point2D(20, 250), new Point2D(0.5, -0.1));
+	}
+
+	public void draw(GraphicsContext gc) {
+		gc.setFill(Color.WHITE);
+		gc.clearRect(0, 0, width, height);
+		nicerObstacle.draw(gc);
+		obstacle1.draw(gc);
+		obstacle2.draw(gc);
+		player.draw(gc);
+	}
+
+	public void simulate(double delay) {
+		player.simulate(0);
+	}
+
+}
diff --git a/src/main/java/lab/NicerObstacle.java b/src/main/java/lab/NicerObstacle.java
new file mode 100644
index 0000000..fd39886
--- /dev/null
+++ b/src/main/java/lab/NicerObstacle.java
@@ -0,0 +1,27 @@
+package lab;
+
+import javafx.geometry.Point2D;
+import javafx.scene.canvas.GraphicsContext;
+import javafx.scene.image.Image;
+
+public class NicerObstacle {
+
+	private Level level;
+	private Image image;
+	private Point2D position;
+
+	public NicerObstacle(Level level, Point2D position) {
+		this.level = level;
+		this.position = position;
+		image = new Image(getClass().getResourceAsStream("spike.gif"));
+	}
+
+	public void draw(GraphicsContext gc) {
+		gc.drawImage(image, position.getX(), position.getY());
+	}
+
+	public void simulate(double delay) {
+		
+	}
+
+}
diff --git a/src/main/java/lab/Obstacle.java b/src/main/java/lab/Obstacle.java
new file mode 100644
index 0000000..0c0fe1d
--- /dev/null
+++ b/src/main/java/lab/Obstacle.java
@@ -0,0 +1,38 @@
+package lab;
+
+import javafx.geometry.Dimension2D;
+import javafx.geometry.Point2D;
+import javafx.scene.canvas.GraphicsContext;
+import javafx.scene.paint.Color;
+
+public class Obstacle {
+
+	private Level level;
+	private Point2D position;
+	private Dimension2D size;
+
+	public Obstacle(Level level) {
+		this(level, new Point2D(200, 100), new Dimension2D(30, 20));
+	}
+
+	public Obstacle(Level level, Point2D position, Dimension2D size) {
+		this.level = level;
+		this.position = position;
+		this.size = size;
+	}
+
+	public void draw(GraphicsContext gc) {
+		gc.save();
+		gc.setFill(Color.BLUEVIOLET);
+		gc.setStroke(Color.RED);
+		gc.setLineWidth(3);
+		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 delay) {
+
+	}
+
+}
diff --git a/src/main/java/lab/Player.java b/src/main/java/lab/Player.java
new file mode 100644
index 0000000..aa8e620
--- /dev/null
+++ b/src/main/java/lab/Player.java
@@ -0,0 +1,43 @@
+package lab;
+
+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 Player {
+	private Level level;
+	private Point2D position;
+	private Point2D speed;
+
+	public Player(Level level, Point2D position, Point2D speed) {
+		this.level = level;
+		this.position = position;
+		this.speed = speed;
+	}
+
+	public void draw(GraphicsContext gc) {
+		gc.save();
+		Point2D center = position.add(10, 25);
+		double angle = speed.angle(1, 0);
+		if (speed.getY() < 0) {
+			angle = -angle;
+		}
+		Rotate rotateMatrix = Affine.rotate(angle, center.getX(), center.getY());
+		gc.setTransform(new Affine(rotateMatrix));
+		gc.setFill(Color.AQUA);
+		gc.setStroke(Color.GREEN);
+		gc.setLineWidth(5);
+		gc.fillRect(center.getX(), center.getY(), 50, 1);
+		gc.fillRoundRect(position.getX(), position.getY(), 20, 50, 20, 20);
+		gc.strokeRoundRect(position.getX(), position.getY(), 20, 50, 20, 20);
+		gc.restore();
+	}
+
+	public void simulate(double delay) {
+		position = position.add(speed);
+		speed = speed.multiply(0.998);
+	}
+
+}
diff --git a/src/main/resources/lab/spike.gif b/src/main/resources/lab/spike.gif
new file mode 100644
index 0000000000000000000000000000000000000000..0d7d4186d65da5d8534d7ae3394b777edd5518b9
GIT binary patch
literal 24413
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

literal 0
HcmV?d00001

-- 
GitLab