diff --git a/src/main/java/lab/Boat.java b/src/main/java/lab/Boat.java index ceafc8c658e705d44556c73000781e6cfcae176b..574c194452833ae6804f442c94b841417fc1126f 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 ccf2018447fd23b465db160f0f853374d0aa74de..56c94df054f39bfe2dd77cfdf8a7859445824d20 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 0000000000000000000000000000000000000000..e27d7e082b6bb002fee7e99a80896ca2fec64747 --- /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 50c9db636a516bb58fa535d74c8cad99eb838a79..b5a1b437e6d0274ae610f585c6cd71a78ee08611 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 6b4a4ea2e5481474905f152d1e442371469f35b2..eaf6e258733fb24f5eb8258fa3bfb41ec9b5513b 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 Binary files /dev/null and b/src/main/resources/lab/LochNess.gif differ