From 00522675ddc7d971f19159aa3e74e481cd25d3b4 Mon Sep 17 00:00:00 2001 From: jez04 <david.jezek@post.cz> Date: Thu, 10 Oct 2024 00:10:41 +0200 Subject: [PATCH] feat: solution --- src/main/java/lab/Level.java | 21 +++++++++++ src/main/java/lab/Monster.java | 49 +++++++++++++++++++++++++ src/main/java/lab/Player.java | 7 +++- src/main/resources/lab/red-monster.gif | Bin 0 -> 6799 bytes 4 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 src/main/java/lab/Monster.java create mode 100644 src/main/resources/lab/red-monster.gif diff --git a/src/main/java/lab/Level.java b/src/main/java/lab/Level.java index d8645b9..f4a0be2 100644 --- a/src/main/java/lab/Level.java +++ b/src/main/java/lab/Level.java @@ -13,6 +13,7 @@ public class Level { private Player player; private double width; private double height; + private Monster[] monsters; public Level(double width, double height) { this.width = width; @@ -21,6 +22,10 @@ public class Level { 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(100, -20)); + monsters = new Monster[5]; + for (int i = 0; i < monsters.length; i++) { + monsters[i] = new Monster(this); + } } public void draw(GraphicsContext gc) { @@ -30,10 +35,26 @@ public class Level { obstacle1.draw(gc); obstacle2.draw(gc); player.draw(gc); + for (Monster monster : monsters) { + monster.draw(gc); + } } public void simulate(double delay) { player.simulate(delay); + for (Monster monster : monsters) { + monster.simulate(delay); + if (monster.getBoundingBox().intersects(player.getBoundingBox())) { + monster.changeDirection(); + } + } } + public double getWidth() { + return width; + } + + public double getHeight() { + return height; + } } diff --git a/src/main/java/lab/Monster.java b/src/main/java/lab/Monster.java new file mode 100644 index 0000000..88144d1 --- /dev/null +++ b/src/main/java/lab/Monster.java @@ -0,0 +1,49 @@ +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 Monster { + + private static final Random RANDOM = new Random(); + + private Level level; + private Image image; + private Point2D position; + private Point2D speed; + + public Monster(Level level) { + this.level = level; + image = new Image(getClass().getResourceAsStream("red-monster.gif")); + position = new Point2D(level.getWidth() * 0.5 + RANDOM.nextDouble(level.getWidth() * 0.5 - image.getWidth()), + RANDOM.nextDouble(level.getHeight())); + speed = new Point2D(0, RANDOM.nextDouble(50, 150)); + } + + public Monster(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 changeDirection() { + speed = speed.multiply(-1); + } + public void simulate(double delay) { + position = position.add(speed.multiply(delay / 1_000_000_000)); + position = new Point2D(position.getX(), position.getY() % level.getHeight()); + } + + public Rectangle2D getBoundingBox() { + return new Rectangle2D(position.getX(), position.getY(), image.getWidth(), image.getHeight()); + } + +} diff --git a/src/main/java/lab/Player.java b/src/main/java/lab/Player.java index 92f7fd6..db14f4a 100644 --- a/src/main/java/lab/Player.java +++ b/src/main/java/lab/Player.java @@ -1,6 +1,7 @@ package lab; import javafx.geometry.Point2D; +import javafx.geometry.Rectangle2D; import javafx.scene.canvas.GraphicsContext; import javafx.scene.paint.Color; import javafx.scene.transform.Affine; @@ -37,7 +38,11 @@ public class Player { public void simulate(double delay) { position = position.add(speed.multiply(delay/1_000_000_000)); - speed = speed.multiply(0.9994); +// speed = speed.multiply(0.9994); + } + + public Rectangle2D getBoundingBox() { + return new Rectangle2D(position.getX(), position.getY(), 20, 50); } } diff --git a/src/main/resources/lab/red-monster.gif b/src/main/resources/lab/red-monster.gif new file mode 100644 index 0000000000000000000000000000000000000000..c545c2220ec3a52e9b046308ea4a1c1620db0f40 GIT binary patch literal 6799 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 L6fET+!2SOMfxLig literal 0 HcmV?d00001 -- GitLab