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