diff --git a/src/main/java/lab/AbleToHit.java b/src/main/java/lab/AbleToHit.java new file mode 100644 index 0000000000000000000000000000000000000000..22f93adad91a0310a252851afd4e057b29d3ca7c --- /dev/null +++ b/src/main/java/lab/AbleToHit.java @@ -0,0 +1,5 @@ +package lab; + +public interface AbleToHit extends Collisionable { + +} diff --git a/src/main/java/lab/BulletAnimated.java b/src/main/java/lab/BulletAnimated.java index 148b2385fba57c7bbec6f4b56285ca7461ece9ea..e19e67def708dcedbe8f4cc3aba351ddbaf930aa 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 extends WorldEntity implements AbleToHit { private Point2D position; private Point2D start; @@ -22,7 +22,6 @@ public class BulletAnimated { private double dragCoefficient = 0.47; private Image image; - private World world; private Cannon cannon; public BulletAnimated(World world, Cannon cannon) { @@ -30,24 +29,24 @@ public class BulletAnimated { } public BulletAnimated(World world, Cannon cannon, Point2D start, Point2D speed, double size) { + super(world); this.start = start; this.position = this.start; this.initialSpeed = speed; this.speed = speed; this.size = size; - this.world = world; this.cannon = cannon; image = new Image(getClass().getResourceAsStream("fireball-transparent.gif"), size, size, true, true); } - public void draw(GraphicsContext gc) { - gc.save(); - Point2D canvasPosition = world.getCanvasPoint(position); + @Override + protected void drawInternal(GraphicsContext gc) { + Point2D canvasPosition = getWorld().getCanvasPoint(position); gc.drawImage(image, canvasPosition.getX(), canvasPosition.getY()); - gc.restore(); } + @Override public void simulate(double deltaT) { if (accelerate && start.distance(position) < cannonLength) { double cannonAngle = cannon.getAngle(); @@ -74,10 +73,18 @@ public class BulletAnimated { } } + @Override public Rectangle2D getBoundingBox() { return new Rectangle2D(position.getX(), position.getY(), size, size); } + @Override + public void hitBy(Collisionable that) { + if (that instanceof Dragon) { + 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..0c8b683cd2115ce95c4171c7739d597af0e5d6c8 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; @@ -23,6 +23,7 @@ public class Cannon { this.size = size; } + @Override public void simulate(double timeStep) { angle = angle + direction*80*timeStep; if(angle <=-90 || angle >= 0) { @@ -30,6 +31,7 @@ public class Cannon { } } + @Override public void draw(GraphicsContext gc) { gc.save(); Point2D worldPosition = world.getCanvasPoint(position); diff --git a/src/main/java/lab/Collisionable.java b/src/main/java/lab/Collisionable.java new file mode 100644 index 0000000000000000000000000000000000000000..52ce3b2bec1904458f54b6a4ef6d8a18b12005d2 --- /dev/null +++ b/src/main/java/lab/Collisionable.java @@ -0,0 +1,17 @@ +package lab; + +import javafx.geometry.Rectangle2D; + +public interface Collisionable { + Rectangle2D getBoundingBox(); + + void hitBy(Collisionable that); + + default void checkCollision(Object entity) { + if (entity instanceof Collisionable ce2 + && this.getBoundingBox().intersects(ce2.getBoundingBox())) { + ce2.hitBy(this); + this.hitBy(ce2); + } + } +} diff --git a/src/main/java/lab/Dragon.java b/src/main/java/lab/Dragon.java index 216628afbd03d95d4896abc8b5175efcb25709c8..362063a49c771b04065c76b48408804252263ff5 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(); @@ -35,11 +35,17 @@ 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 that) { + if (that instanceof BulletAnimated) { + 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..0a2f949ead08f9f75fafea106b53c3a318bd40b5 --- /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); + + +} \ No newline at end of file diff --git a/src/main/java/lab/World.java b/src/main/java/lab/World.java index c531c516d183793f4bc8eb3c381b6856c967e25f..e6cd86394d93acc370ff6ee7577696c59e542fb3 100644 --- a/src/main/java/lab/World.java +++ b/src/main/java/lab/World.java @@ -1,24 +1,31 @@ package lab; +import java.util.Set; + import javafx.geometry.Point2D; 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)); + /*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)), 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 cannon; + entities = new DrawableSimulable[] { + cannon = new Cannon(this, new Point2D(50, 50), new Point2D(100, 20)), + 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)) + }; } public Point2D getCanvasPoint(Point2D worldPoint) { @@ -27,22 +34,22 @@ public class World { public void draw(GraphicsContext gc) { gc.clearRect(0, 0, width, height); - 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 AbleToHit ce) { + for (DrawableSimulable entity2: entities) { + if (entity != entity2) { + ce.checkCollision(entity2); + } + } } - dragon.simulate(timeDelta); } } diff --git a/src/main/java/lab/WorldEntity.java b/src/main/java/lab/WorldEntity.java new file mode 100644 index 0000000000000000000000000000000000000000..6c4db9d1d20e395adadfbb5bfd960bfd3d5e6200 --- /dev/null +++ b/src/main/java/lab/WorldEntity.java @@ -0,0 +1,27 @@ +package lab; + +import javafx.scene.canvas.GraphicsContext; + +public abstract class WorldEntity implements DrawableSimulable { + + private final World world; + + public WorldEntity(World world) { + this.world = world; + } + + @Override + public final void draw(GraphicsContext gc) { + gc.save(); + drawInternal(gc); + gc.restore(); + + } + + protected World getWorld() { + return world; + } + + protected abstract void drawInternal(GraphicsContext gc); + +}