diff --git a/src/main/java/lab/BulletAnimated.java b/src/main/java/lab/BulletAnimated.java index 294ad2224d36c995a397101beddad77507592ede..6f26fde2460dfb643d30a986c315ae8113cfefe4 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; @@ -76,11 +76,17 @@ public class BulletAnimated { } - + + @Override public Rectangle2D getBoundingBox() { return new Rectangle2D(position.getX(), position.getY(), size, size); } + @Override + public void hitBy(Collisionable col) { + reload(); + } + public boolean overlaps(Dragon dragon) { return getBoundingBox().intersects(dragon.getBoundingBox()); } diff --git a/src/main/java/lab/Cannon.java b/src/main/java/lab/Cannon.java index b46745dc0779c5152639f0c4c9815c34f80d56fa..88b7675a4f7da09ca5729934903660b2b99379fe 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 0000000000000000000000000000000000000000..c22862d1244c8ded9850c1e47c7253a58130fee2 --- /dev/null +++ b/src/main/java/lab/Collisionable.java @@ -0,0 +1,11 @@ +package lab; + +import javafx.geometry.Rectangle2D; + +public interface Collisionable { + Rectangle2D getBoundingBox(); + default boolean intersects(Collisionable col) { + return getBoundingBox().intersects(col.getBoundingBox()); + } + void hitBy(Collisionable col); +} diff --git a/src/main/java/lab/Dragon.java b/src/main/java/lab/Dragon.java index 216628afbd03d95d4896abc8b5175efcb25709c8..2219a792fb9b33de81f2e8b60f6573b016811817 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; @@ -35,18 +35,21 @@ public class Dragon { position = new Point2D(newX, newY); } - + @Override public Rectangle2D getBoundingBox() { return new Rectangle2D(position.getX(), position.getY(), size, size); } - + + @Override + public void hitBy(Collisionable col) { + if (!(col instanceof Dragon)) { + hit(); + } + } public void hit() { speed = speed.multiply(-1.); } - - - } diff --git a/src/main/java/lab/DrawableSimulable.java b/src/main/java/lab/DrawableSimulable.java new file mode 100644 index 0000000000000000000000000000000000000000..f0925cd6285efe7a50e2d8a49f27a0b2544735d6 --- /dev/null +++ b/src/main/java/lab/DrawableSimulable.java @@ -0,0 +1,8 @@ +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 ce631f92042437d374ab6c311c2778450a88858c..23d8e89578a9b399f56749d9ad1204a15b7af8c5 100644 --- a/src/main/java/lab/World.java +++ b/src/main/java/lab/World.java @@ -7,19 +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)); + BulletAnimated bulletAnimatted = new BulletAnimated(this, cannon, new Point2D(30, 60), new Point2D(0, 0), 40); + entities = new DrawableSimulable[] { 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)) }; + new Dragon(this, new Point2D(50, 270), new Point2D(-50, 20)), cannon, bulletAnimatted }; } public Point2D getCanvasPoint(Point2D worldPoint) { @@ -29,22 +26,35 @@ 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); - cannon.simulate(timeDelta); - for(Dragon dragon: dragons) { - if (bulletAnimatted.overlaps(dragon)) { - dragon.hit(); - bulletAnimatted.reload(); + for(DrawableSimulable entity: entities) { + entity.simulate(timeDelta); + + if (entity instanceof Collisionable) { + Collisionable col = (Collisionable) entity; + for (DrawableSimulable entity2 : entities) { + if (entity != entity2 && entity2 instanceof Collisionable) { + Collisionable col2 = (Collisionable) entity2; + if (col.intersects(col2)) { + col.hitBy(col2); + col2.hitBy(col); + } + } + } + } - dragon.simulate(timeDelta); + //ověř, že entity je Collisionable: + // pro všechny entity2 z entities: + //ověř že se nejedná of "entity" a že Collisionable + //ověř, že entity a entity2 jsou v kolizi: + //zavolej na obě hitBy + } }