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