diff --git a/racevisionGame/src/main/java/mock/model/RaceLogic.java b/racevisionGame/src/main/java/mock/model/RaceLogic.java index 308c4b46..3b74d5c8 100644 --- a/racevisionGame/src/main/java/mock/model/RaceLogic.java +++ b/racevisionGame/src/main/java/mock/model/RaceLogic.java @@ -2,6 +2,7 @@ package mock.model; import javafx.animation.AnimationTimer; import mock.model.collider.Collision; +import mock.model.commandFactory.CollisionCommand; import mock.model.commandFactory.Command; import mock.model.commandFactory.CompositeCommand; import mock.model.commandFactory.CommandFactory; @@ -222,11 +223,9 @@ public class RaceLogic implements RunnableWithFramePeriod, Observer { @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"); + if(arg instanceof Collision) { + Collision collision = (Collision)arg; + commands.addCommand(new CollisionCommand(race, (MockBoat)collision.getBoat())); + } } } diff --git a/racevisionGame/src/main/java/mock/model/collider/Collider.java b/racevisionGame/src/main/java/mock/model/collider/Collider.java index 029fee57..28c01f9f 100644 --- a/racevisionGame/src/main/java/mock/model/collider/Collider.java +++ b/racevisionGame/src/main/java/mock/model/collider/Collider.java @@ -25,13 +25,9 @@ public abstract class Collider extends Observable implements Locatable { Bearing relative = Bearing.fromDegrees(absolute.degrees() - boat.getBearing().degrees()); if(actualDistance <= distance) { - Collision collision = new Collision(relative, distance); + Collision collision = new Collision(boat, relative, distance); // Notify object of collision - onCollisionEnter(boat, collision); - // Notify observers of collision - notifyObservers(collision); - this.setChanged(); - + onCollisionEnter(collision); return true; } else return false; } @@ -45,8 +41,7 @@ public abstract class Collider extends Observable implements Locatable { /** * Handle a collision event - * @param collider Boat that is colliding * @param e details of collision */ - public abstract void onCollisionEnter(Boat collider, Collision e); + public abstract void onCollisionEnter(Collision e); } diff --git a/racevisionGame/src/main/java/mock/model/collider/ColliderRegistry.java b/racevisionGame/src/main/java/mock/model/collider/ColliderRegistry.java index 69eac91a..6f82daeb 100644 --- a/racevisionGame/src/main/java/mock/model/collider/ColliderRegistry.java +++ b/racevisionGame/src/main/java/mock/model/collider/ColliderRegistry.java @@ -1,5 +1,6 @@ package mock.model.collider; +import mock.model.MockBoat; import shared.model.Boat; import shared.model.GPSCoordinate; @@ -39,7 +40,7 @@ public class ColliderRegistry extends Collider implements Observer { } @Override - public void onCollisionEnter(Boat collider, Collision e) {} + public void onCollisionEnter(Collision e) {} @Override public GPSCoordinate getPosition() { @@ -60,7 +61,7 @@ public class ColliderRegistry extends Collider implements Observer { public void update(Observable o, Object arg) { Collision collision = (Collision)arg; - notifyObservers(collision); this.setChanged(); + notifyObservers(collision); } } diff --git a/racevisionGame/src/main/java/mock/model/collider/Collision.java b/racevisionGame/src/main/java/mock/model/collider/Collision.java index 5a987bde..225cf342 100644 --- a/racevisionGame/src/main/java/mock/model/collider/Collision.java +++ b/racevisionGame/src/main/java/mock/model/collider/Collision.java @@ -1,6 +1,7 @@ package mock.model.collider; import shared.model.Bearing; +import shared.model.Boat; /** * Data structure for holding collision details for ray casting and event handling. @@ -14,13 +15,19 @@ public class Collision { * Distance from boat centre to target centre */ private double distance; + /** + * Boat involved in the collision + */ + private Boat boat; /** * Constructor for Collision structure + * @param boat involved in collision * @param bearing from boat heading to target * @param distance from boat centre to target centre */ - public Collision(Bearing bearing, double distance) { + public Collision(Boat boat, Bearing bearing, double distance) { + this.boat = boat; this.bearing = bearing; this.distance = distance; } @@ -32,4 +39,8 @@ public class Collision { public double getDistance() { return distance; } + + public Boat getBoat() { + return boat; + } } diff --git a/racevisionGame/src/main/java/mock/model/commandFactory/CollisionCommand.java b/racevisionGame/src/main/java/mock/model/commandFactory/CollisionCommand.java new file mode 100644 index 00000000..3314c402 --- /dev/null +++ b/racevisionGame/src/main/java/mock/model/commandFactory/CollisionCommand.java @@ -0,0 +1,39 @@ +package mock.model.commandFactory; + +import mock.model.MockBoat; +import mock.model.MockRace; +import shared.model.Azimuth; +import shared.model.GPSCoordinate; + +import java.util.Observable; + +/** + * Created by cbt24 on 7/09/17. + */ +public class CollisionCommand extends ObserverCommand { + private GPSCoordinate startingPosition; + private Azimuth azimuth; + private double distance; + + public CollisionCommand(MockRace race, MockBoat boat) { + super(race, boat); + } + + @Override + public void execute() { + this.azimuth = Azimuth.fromDegrees(boat.getBearing().degrees() - 180d); + this.startingPosition = boat.getPosition(); + this.distance = 30; + boat.setVelocityDefault(false); + } + + @Override + public void update(Observable o, Object arg) { + if(GPSCoordinate.calculateDistanceMeters(boat.getPosition(), startingPosition) < distance) { + boat.setPosition(GPSCoordinate.calculateNewPosition(boat.getPosition(), 2, azimuth)); + } else { + race.deleteObserver(this); + boat.setVelocityDefault(true); + } + } +} diff --git a/racevisionGame/src/main/java/shared/model/Boat.java b/racevisionGame/src/main/java/shared/model/Boat.java index 31ce7ad4..bd3eea5e 100644 --- a/racevisionGame/src/main/java/shared/model/Boat.java +++ b/racevisionGame/src/main/java/shared/model/Boat.java @@ -403,10 +403,6 @@ public class Boat extends Collider { public boolean isSailsOut() { return sailsOut; } - public void bounce(double repulsionRadius) { - Azimuth reverseAzimuth = Azimuth.fromDegrees(getBearing().degrees() - 180d); - setPosition(GPSCoordinate.calculateNewPosition(getPosition(), 2 * repulsionRadius, reverseAzimuth)); - } @Override public boolean rayCast(Boat boat) { @@ -416,9 +412,11 @@ public class Boat extends Collider { } @Override - public void onCollisionEnter(Boat collider, Collision e) { + public void onCollisionEnter(Collision e) { if(e.getBearing().degrees() > 270 || e.getBearing().degrees() < 90) { - collider.bounce(100); + // Notify observers of collision + this.setChanged(); + notifyObservers(e); } } } diff --git a/racevisionGame/src/main/java/shared/model/Mark.java b/racevisionGame/src/main/java/shared/model/Mark.java index d236d076..23778cff 100644 --- a/racevisionGame/src/main/java/shared/model/Mark.java +++ b/racevisionGame/src/main/java/shared/model/Mark.java @@ -101,7 +101,8 @@ public class Mark extends Collider{ } @Override - public void onCollisionEnter(Boat collider, Collision e) { - collider.bounce(repulsionRadius); + public void onCollisionEnter(Collision e) { + this.setChanged(); + notifyObservers(e); } }