diff --git a/racevisionGame/src/main/java/mock/model/RaceLogic.java b/racevisionGame/src/main/java/mock/model/RaceLogic.java index 7c2e6dd3..a3560bbd 100644 --- a/racevisionGame/src/main/java/mock/model/RaceLogic.java +++ b/racevisionGame/src/main/java/mock/model/RaceLogic.java @@ -1,6 +1,8 @@ package mock.model; import javafx.animation.AnimationTimer; +import mock.model.collider.Collision; +import mock.model.commandFactory.Command; import mock.model.commandFactory.CompositeCommand; import mock.model.commandFactory.CommandFactory; import network.Messages.Enums.BoatActionEnum; @@ -9,8 +11,11 @@ import network.Messages.Enums.RaceStatusEnum; import network.Messages.LatestMessages; import shared.model.RunnableWithFramePeriod; +import java.util.Observable; +import java.util.Observer; -public class RaceLogic implements RunnableWithFramePeriod { + +public class RaceLogic implements RunnableWithFramePeriod, Observer { /** * State of current race modified by this object */ @@ -32,6 +37,8 @@ public class RaceLogic implements RunnableWithFramePeriod { this.race = race; this.server = new RaceServer(race, messages); this.commands = compositeCommand; + + race.getColliderRegistry().addObserver(this); } /** @@ -168,4 +175,14 @@ public class RaceLogic implements RunnableWithFramePeriod { public MockRace getRace() { return race; } + + @Override + public void update(Observable o, Object arg) { + Collision e = (Collision)arg; + + if(e.getBearing().degrees() == 0) System.out.println("Ahead"); + else if(e.getBearing().degrees() < 90) System.out.println("Starboard"); + else if(e.getBearing().degrees() > 270) System.out.println("Port"); + else System.out.println("Behind"); + } } diff --git a/racevisionGame/src/main/java/mock/model/collider/Collider.java b/racevisionGame/src/main/java/mock/model/collider/Collider.java index 967af804..32fb25eb 100644 --- a/racevisionGame/src/main/java/mock/model/collider/Collider.java +++ b/racevisionGame/src/main/java/mock/model/collider/Collider.java @@ -5,10 +5,12 @@ import shared.model.Boat; import shared.model.GPSCoordinate; import shared.model.Locatable; +import java.util.Observable; + /** * Interface for all objects sensitive to collision in a race. */ -public abstract class Collider implements Locatable { +public abstract class Collider extends Observable implements Locatable { /** * Indicates whether a ray cast from a boat to a target collider is within the specified length. * @param boat potentially colliding with target @@ -23,7 +25,13 @@ public abstract class Collider implements Locatable { Bearing relative = Bearing.fromDegrees(absolute.degrees() - boat.getBearing().degrees()); if(actualDistance <= distance) { - onCollisionEnter(new Collision(relative, distance)); + Collision collision = new Collision(relative, distance); + // Notify object of collision + onCollisionEnter(collision); + // Notify observers of collision + notifyObservers(collision); + this.setChanged(); + return true; } else return false; } diff --git a/racevisionGame/src/main/java/mock/model/collider/ColliderRegistry.java b/racevisionGame/src/main/java/mock/model/collider/ColliderRegistry.java index efc0caa5..746b9fa4 100644 --- a/racevisionGame/src/main/java/mock/model/collider/ColliderRegistry.java +++ b/racevisionGame/src/main/java/mock/model/collider/ColliderRegistry.java @@ -3,14 +3,12 @@ package mock.model.collider; import shared.model.Boat; import shared.model.GPSCoordinate; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; +import java.util.*; /** * Registry for all Collider objects in a MockRace. Wraps the Collider interface as part of a Composite Pattern. */ -public class ColliderRegistry extends Collider { +public class ColliderRegistry extends Collider implements Observer { /** * List of all registered Colliders */ @@ -24,6 +22,7 @@ public class ColliderRegistry extends Collider { } public void addCollider(Collider collider) { + collider.addObserver(this); colliders.add(collider); } @@ -51,4 +50,17 @@ public class ColliderRegistry extends Collider { public void setPosition(GPSCoordinate position) { } + + /** + * Fire onCollisionEnter when collision bubbles up from registered colliders. + * @param o object collided with + * @param arg parameters of the collision + */ + @Override + public void update(Observable o, Object arg) { + Collision collision = (Collision)arg; + + notifyObservers(collision); + this.setChanged(); + } } diff --git a/racevisionGame/src/main/java/shared/model/Boat.java b/racevisionGame/src/main/java/shared/model/Boat.java index 16ec08b9..7aff1222 100644 --- a/racevisionGame/src/main/java/shared/model/Boat.java +++ b/racevisionGame/src/main/java/shared/model/Boat.java @@ -401,6 +401,5 @@ public class Boat extends Collider { @Override public void onCollisionEnter(Collision e) { - System.out.println(e.getBearing().degrees()); } } diff --git a/racevisionGame/src/main/java/shared/model/Mark.java b/racevisionGame/src/main/java/shared/model/Mark.java index 149713be..aa123aff 100644 --- a/racevisionGame/src/main/java/shared/model/Mark.java +++ b/racevisionGame/src/main/java/shared/model/Mark.java @@ -86,9 +86,5 @@ public class Mark extends Collider { @Override public void onCollisionEnter(Collision e) { - if(e.getBearing().degrees() == 0) System.out.println("Ahead"); - else if(e.getBearing().degrees() < 90) System.out.println("Starboard"); - else if(e.getBearing().degrees() > 270) System.out.println("Port"); - else System.out.println("Behind"); } }