From 7b1c65c6d4cd6be77aa34ce552e62bbe1960f4f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Ko=C5=BEusznik?= <jan@kozusznik.cz> Date: Mon, 4 Oct 2021 15:46:35 +0200 Subject: [PATCH] =?UTF-8?q?lab04-solution:=20Pond=C4=9Bl=C3=AD=2014:15?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lab/BulletAnimated.java | 6 +++- src/main/java/lab/Cannon.java | 2 +- src/main/java/lab/Collisionable.java | 13 ++++++++ src/main/java/lab/Dragon.java | 14 +++++++-- src/main/java/lab/DrawableSimulable.java | 11 +++++++ src/main/java/lab/World.java | 39 ++++++++++++++++-------- 6 files changed, 67 insertions(+), 18 deletions(-) create mode 100644 src/main/java/lab/Collisionable.java create mode 100644 src/main/java/lab/DrawableSimulable.java diff --git a/src/main/java/lab/BulletAnimated.java b/src/main/java/lab/BulletAnimated.java index 27eae34..bfe0a20 100644 --- a/src/main/java/lab/BulletAnimated.java +++ b/src/main/java/lab/BulletAnimated.java @@ -5,7 +5,7 @@ import javafx.geometry.Rectangle2D; import javafx.scene.canvas.GraphicsContext; import javafx.scene.image.Image; -public class BulletAnimated { +public class BulletAnimated implements DrawableSimulable, Collisionable{ private Point2D position; private Point2D start; @@ -85,6 +85,10 @@ public class BulletAnimated { return getBoundingBox().intersects(dragon.getBoundingBox()); } + public void hitBy(Collisionable other) { + reload(); + } + public void reload() { position = start; speed = initialSpeed; diff --git a/src/main/java/lab/Cannon.java b/src/main/java/lab/Cannon.java index 92c5431..eb3f789 100644 --- a/src/main/java/lab/Cannon.java +++ b/src/main/java/lab/Cannon.java @@ -5,7 +5,7 @@ import javafx.scene.canvas.GraphicsContext; import javafx.scene.paint.Color; import javafx.scene.transform.Affine; -public class Cannon { +public class Cannon implements DrawableSimulable { private int direction=-1; private double angle = 0; diff --git a/src/main/java/lab/Collisionable.java b/src/main/java/lab/Collisionable.java new file mode 100644 index 0000000..3cf3eb4 --- /dev/null +++ b/src/main/java/lab/Collisionable.java @@ -0,0 +1,13 @@ +package lab; + +import javafx.geometry.Rectangle2D; + +public interface Collisionable { + Rectangle2D getBoundingBox(); + + default boolean intersects(Collisionable other) { + return getBoundingBox().intersects(other.getBoundingBox()); + } + + void hitBy(Collisionable other); +} diff --git a/src/main/java/lab/Dragon.java b/src/main/java/lab/Dragon.java index 216628a..987de59 100644 --- a/src/main/java/lab/Dragon.java +++ b/src/main/java/lab/Dragon.java @@ -4,7 +4,7 @@ import javafx.geometry.Point2D; import javafx.geometry.Rectangle2D; import javafx.scene.canvas.GraphicsContext; -public class Dragon { +public class Dragon implements DrawableSimulable, Collisionable{ private Point2D position; @@ -21,13 +21,13 @@ public class Dragon { this.speed = speed; } - + @Override public void draw(GraphicsContext gc) { Point2D canvasPosition = world.getCanvasPoint(position); gc.drawImage(Constants.DRAGON_IMAGE, canvasPosition.getX(), canvasPosition.getY(), size, size); } - + @Override public void simulate(double timeDelta) { double timeDeltaS = timeDelta; double newX = (position.getX() + speed.getX() * timeDeltaS + world.getWidth()) % world.getWidth(); @@ -45,6 +45,14 @@ public class Dragon { speed = speed.multiply(-1.); } + + @Override + public void hitBy(Collisionable other) { + if (!(other instanceof Dragon)) { + hit(); + } + } + diff --git a/src/main/java/lab/DrawableSimulable.java b/src/main/java/lab/DrawableSimulable.java new file mode 100644 index 0000000..2942fa2 --- /dev/null +++ b/src/main/java/lab/DrawableSimulable.java @@ -0,0 +1,11 @@ +package lab; + +import javafx.scene.canvas.GraphicsContext; + +public interface DrawableSimulable { + + void draw(GraphicsContext gc); + + void simulate(double deltaT); + +} diff --git a/src/main/java/lab/World.java b/src/main/java/lab/World.java index ce631f9..5928056 100644 --- a/src/main/java/lab/World.java +++ b/src/main/java/lab/World.java @@ -7,17 +7,16 @@ import javafx.scene.canvas.GraphicsContext; public class World { private double width; private double height; - private BulletAnimated bulletAnimatted; - private Cannon cannon; - private Dragon[] dragons; - + private DrawableSimulable []entities; + public World(double width, double height) { super(); this.width = width; this.height = height; - cannon = new Cannon(this, new Point2D(50, 50), new Point2D(100, 20)); - bulletAnimatted = new BulletAnimated(this, cannon, new Point2D(30, 60), new Point2D(0, 0), 40); - dragons = new Dragon[] { new Dragon(this, new Point2D(50, 200), new Point2D(100, 5)), + Cannon cannon = new Cannon(this, new Point2D(50, 50), new Point2D(100, 20)); + entities = new DrawableSimulable[] { cannon, + new BulletAnimated(this, cannon, new Point2D(30, 60), new Point2D(0, 0), 40), + new Dragon(this, new Point2D(50, 200), new Point2D(100, 5)), new Dragon(this, new Point2D(50, 230), new Point2D(60, 5)), new Dragon(this, new Point2D(50, 270), new Point2D(-50, 20)) }; } @@ -29,23 +28,37 @@ public class World { public void draw(Canvas canvas) { GraphicsContext gc = canvas.getGraphicsContext2D(); gc.clearRect(0, 0, canvas.getWidth(), canvas.getHeight()); - cannon.draw(gc); - bulletAnimatted.draw(gc); - for(Dragon dragon: dragons) { - dragon.draw(gc); + for(DrawableSimulable entity: entities) { + entity.draw(gc); } } public void simulate(double timeDelta) { - bulletAnimatted.simulate(timeDelta); + for(DrawableSimulable entity: entities) { + entity.simulate(timeDelta); + if (entity instanceof Collisionable) { + Collisionable thisCollinsable = (Collisionable) entity; + for(DrawableSimulable entity2 : entities) { + if (entity != entity2 && entity2 instanceof Collisionable) { + Collisionable thatCollinsable = (Collisionable) entity2; + if (thisCollinsable.intersects(thatCollinsable)) { + thisCollinsable.hitBy(thatCollinsable); + thatCollinsable.hitBy(thisCollinsable); + } + } + } + } + } + /*bulletAnimatted.simulate(timeDelta); cannon.simulate(timeDelta); + for(Dragon dragon: dragons) { if (bulletAnimatted.overlaps(dragon)) { dragon.hit(); bulletAnimatted.reload(); } dragon.simulate(timeDelta); - } + }*/ } public double getWidth() { -- GitLab