diff --git a/double-dispatch/src/main/java/com/iluwatar/App.java b/double-dispatch/src/main/java/com/iluwatar/App.java index f238e8cb1..81fbe7796 100644 --- a/double-dispatch/src/main/java/com/iluwatar/App.java +++ b/double-dispatch/src/main/java/com/iluwatar/App.java @@ -8,9 +8,17 @@ public class App { public static void main( String[] args ) { List objects = new ArrayList<>(); objects.add(new FlamingAsteroid(0, 0, 5, 5)); - objects.add(new SpaceStationMir(1, 1, 4, 4)); + objects.add(new SpaceStationMir(1, 1, 2, 2)); objects.add(new Meteoroid(10, 10, 15, 15)); - objects.add(new SpaceStationIss(12, 11, 14, 15)); - objects.stream().forEach(o1 -> objects.stream().forEach(o2 -> { if (o1 != o2) System.out.println(String.format("%s -> %s", o1, o2)); } )); + objects.add(new SpaceStationIss(12, 12, 14, 14)); + + objects.stream().forEach(o -> System.out.println(o)); + System.out.println(""); + + objects.stream().forEach(o1 -> objects.stream().forEach(o2 -> { if (o1 != o2 && o1.intersectsWith(o2)) o1.collision(o2); } )); + System.out.println(""); + + objects.stream().forEach(o -> System.out.println(o)); + System.out.println(""); } } diff --git a/double-dispatch/src/main/java/com/iluwatar/FlamingAsteroid.java b/double-dispatch/src/main/java/com/iluwatar/FlamingAsteroid.java index 6973cd744..a5bcf29d2 100644 --- a/double-dispatch/src/main/java/com/iluwatar/FlamingAsteroid.java +++ b/double-dispatch/src/main/java/com/iluwatar/FlamingAsteroid.java @@ -6,4 +6,9 @@ public class FlamingAsteroid extends Meteoroid { super(left, top, right, bottom); setOnFire(true); } + + @Override + public void collision(GameObject gameObject) { + gameObject.collisionResolve(this); + } } diff --git a/double-dispatch/src/main/java/com/iluwatar/GameObject.java b/double-dispatch/src/main/java/com/iluwatar/GameObject.java index b4deec728..9bcc77a25 100644 --- a/double-dispatch/src/main/java/com/iluwatar/GameObject.java +++ b/double-dispatch/src/main/java/com/iluwatar/GameObject.java @@ -30,4 +30,14 @@ public abstract class GameObject extends Rectangle { public void setDamaged(boolean damaged) { this.damaged = damaged; } + + public abstract void collision(GameObject gameObject); + + public abstract void collisionResolve(FlamingAsteroid asteroid); + + public abstract void collisionResolve(Meteoroid meteoroid); + + public abstract void collisionResolve(SpaceStationMir mir); + + public abstract void collisionResolve(SpaceStationIss iss); } diff --git a/double-dispatch/src/main/java/com/iluwatar/Meteoroid.java b/double-dispatch/src/main/java/com/iluwatar/Meteoroid.java index 40435fcd7..4681f217f 100644 --- a/double-dispatch/src/main/java/com/iluwatar/Meteoroid.java +++ b/double-dispatch/src/main/java/com/iluwatar/Meteoroid.java @@ -5,4 +5,29 @@ public class Meteoroid extends GameObject { public Meteoroid(int left, int top, int right, int bottom) { super(left, top, right, bottom); } + + @Override + public void collision(GameObject gameObject) { + gameObject.collisionResolve(this); + } + + @Override + public void collisionResolve(FlamingAsteroid asteroid) { + System.out.println(String.format("%s hits %s", asteroid.getClass().getSimpleName(), this.getClass().getSimpleName())); + } + + @Override + public void collisionResolve(Meteoroid meteoroid) { + System.out.println(String.format("%s hits %s", meteoroid.getClass().getSimpleName(), this.getClass().getSimpleName())); + } + + @Override + public void collisionResolve(SpaceStationMir mir) { + System.out.println(String.format("%s hits %s", mir.getClass().getSimpleName(), this.getClass().getSimpleName())); + } + + @Override + public void collisionResolve(SpaceStationIss iss) { + System.out.println(String.format("%s hits %s", iss.getClass().getSimpleName(), this.getClass().getSimpleName())); + } } diff --git a/double-dispatch/src/main/java/com/iluwatar/SpaceStationIss.java b/double-dispatch/src/main/java/com/iluwatar/SpaceStationIss.java index ad25e4cc1..6fe70792d 100644 --- a/double-dispatch/src/main/java/com/iluwatar/SpaceStationIss.java +++ b/double-dispatch/src/main/java/com/iluwatar/SpaceStationIss.java @@ -5,4 +5,9 @@ public class SpaceStationIss extends SpaceStationMir { public SpaceStationIss(int left, int top, int right, int bottom) { super(left, top, right, bottom); } + + @Override + public void collision(GameObject gameObject) { + gameObject.collisionResolve(this); + } } diff --git a/double-dispatch/src/main/java/com/iluwatar/SpaceStationMir.java b/double-dispatch/src/main/java/com/iluwatar/SpaceStationMir.java index 9d630cf5c..33964c739 100644 --- a/double-dispatch/src/main/java/com/iluwatar/SpaceStationMir.java +++ b/double-dispatch/src/main/java/com/iluwatar/SpaceStationMir.java @@ -5,4 +5,34 @@ public class SpaceStationMir extends GameObject { public SpaceStationMir(int left, int top, int right, int bottom) { super(left, top, right, bottom); } + + @Override + public void collision(GameObject gameObject) { + gameObject.collisionResolve(this); + } + + @Override + public void collisionResolve(FlamingAsteroid asteroid) { + System.out.println(String.format("%s hits %s", asteroid.getClass().getSimpleName(), this.getClass().getSimpleName())); + setDamaged(true); + setOnFire(true); + } + + @Override + public void collisionResolve(Meteoroid meteoroid) { + System.out.println(String.format("%s hits %s", meteoroid.getClass().getSimpleName(), this.getClass().getSimpleName())); + setDamaged(true); + } + + @Override + public void collisionResolve(SpaceStationMir mir) { + System.out.println(String.format("%s hits %s", mir.getClass().getSimpleName(), this.getClass().getSimpleName())); + setDamaged(true); + } + + @Override + public void collisionResolve(SpaceStationIss iss) { + System.out.println(String.format("%s hits %s", iss.getClass().getSimpleName(), this.getClass().getSimpleName())); + setDamaged(true); + } }