diff --git a/racevisionGame/src/main/java/mock/model/MockBoat.java b/racevisionGame/src/main/java/mock/model/MockBoat.java index 227dfe54..b6cd7a24 100644 --- a/racevisionGame/src/main/java/mock/model/MockBoat.java +++ b/racevisionGame/src/main/java/mock/model/MockBoat.java @@ -1,8 +1,5 @@ package mock.model; - -import mock.model.collider.Collider; -import mock.model.collider.Collision; import shared.model.*; @@ -10,7 +7,7 @@ import shared.model.*; * Represents a Boat on the mock side of a race. * This adds mock specific functionality to a boat. */ -public class MockBoat extends Boat implements Collider { +public class MockBoat extends Boat { /** @@ -303,28 +300,4 @@ public class MockBoat extends Boat implements Collider { public void setAutoVMG(boolean autoVMG) { this.autoVMG = autoVMG; } - - @Override - public boolean rayCast(MockBoat boat, double distance) { - double actualDistance = GPSCoordinate.calculateDistanceMeters(boat.getPosition(), this.getPosition()); - Bearing absolute = GPSCoordinate.calculateBearing(boat.getPosition(), this.getPosition()); - Bearing relative = Bearing.fromDegrees(absolute.degrees() - boat.getBearing().degrees()); - - if(actualDistance <= distance) { - onCollisionEnter(new Collision(relative, actualDistance)); - return true; - } else return false; - } - - @Override - public boolean rayCast(MockBoat boat) { - if(boat != this) { - return rayCast(boat, 100); - } else return false; - } - - @Override - public void onCollisionEnter(Collision e) { - System.out.println(e.getBearing().degrees()); - } } diff --git a/racevisionGame/src/main/java/mock/model/collider/Collider.java b/racevisionGame/src/main/java/mock/model/collider/Collider.java index c7a2fa51..967af804 100644 --- a/racevisionGame/src/main/java/mock/model/collider/Collider.java +++ b/racevisionGame/src/main/java/mock/model/collider/Collider.java @@ -1,29 +1,43 @@ package mock.model.collider; -import mock.model.MockBoat; +import shared.model.Bearing; +import shared.model.Boat; +import shared.model.GPSCoordinate; +import shared.model.Locatable; /** * Interface for all objects sensitive to collision in a race. */ -public interface Collider { +public abstract class Collider 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 * @param distance distance for valid collision * @return whether or not a collision has occurred */ - boolean rayCast(MockBoat boat, double distance); + public boolean rayCast(Boat boat, double distance) { + double actualDistance = GPSCoordinate.calculateDistanceMeters(boat.getPosition(), this.getPosition()); + // Compass direction of collider + Bearing absolute = Bearing.fromAzimuth(GPSCoordinate.calculateAzimuth(boat.getPosition(), this.getPosition())); + // Direction of collider from heading + Bearing relative = Bearing.fromDegrees(absolute.degrees() - boat.getBearing().degrees()); + + if(actualDistance <= distance) { + onCollisionEnter(new Collision(relative, distance)); + return true; + } else return false; + } /** * Indicates whether a ray cast from a boat to a target collider triggers a collision. Distance is set by the object. * @param boat potentially colliding with target * @return whether or not a collision has occurred */ - boolean rayCast(MockBoat boat); + public abstract boolean rayCast(Boat boat); /** * Handle a collision event * @param e details of collision */ - void onCollisionEnter(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 7127b75c..efc0caa5 100644 --- a/racevisionGame/src/main/java/mock/model/collider/ColliderRegistry.java +++ b/racevisionGame/src/main/java/mock/model/collider/ColliderRegistry.java @@ -1,6 +1,7 @@ package mock.model.collider; -import mock.model.MockBoat; +import shared.model.Boat; +import shared.model.GPSCoordinate; import java.util.ArrayList; import java.util.Collection; @@ -9,7 +10,7 @@ import java.util.List; /** * Registry for all Collider objects in a MockRace. Wraps the Collider interface as part of a Composite Pattern. */ -public class ColliderRegistry implements Collider { +public class ColliderRegistry extends Collider { /** * List of all registered Colliders */ @@ -26,21 +27,12 @@ public class ColliderRegistry implements Collider { colliders.add(collider); } - public void removeCollider(Collider collider) { - colliders.remove(collider); - } - public void addAllColliders(Collection colliders) { for(Collider collider: colliders) addCollider(collider); } @Override - public boolean rayCast(MockBoat boat, double distance) { - return false; - } - - @Override - public boolean rayCast(MockBoat boat) { + public boolean rayCast(Boat boat) { for(Collider collider: colliders) { if(collider.rayCast(boat)) return true; } @@ -49,4 +41,14 @@ public class ColliderRegistry implements Collider { @Override public void onCollisionEnter(Collision e) {} + + @Override + public GPSCoordinate getPosition() { + return null; + } + + @Override + public void setPosition(GPSCoordinate position) { + + } } diff --git a/racevisionGame/src/main/java/shared/model/Boat.java b/racevisionGame/src/main/java/shared/model/Boat.java index 9d1d0c40..16ec08b9 100644 --- a/racevisionGame/src/main/java/shared/model/Boat.java +++ b/racevisionGame/src/main/java/shared/model/Boat.java @@ -2,6 +2,8 @@ package shared.model; import javafx.beans.property.*; +import mock.model.collider.Collider; +import mock.model.collider.Collision; import network.Messages.Enums.BoatStatusEnum; import org.jetbrains.annotations.Nullable; @@ -10,7 +12,7 @@ import java.time.ZonedDateTime; /** * Boat Model that is used to store information on the boats that are running in the race. */ -public class Boat implements Locatable { +public class Boat extends Collider { /** * The name of the boat/team. */ @@ -390,4 +392,15 @@ public class Boat implements Locatable { this.timeAtLastMark = timeAtLastMark; } + @Override + public boolean rayCast(Boat boat) { + if(boat != this) { + return rayCast(boat, 100); + } else return false; + } + + @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 1dddeea8..149713be 100644 --- a/racevisionGame/src/main/java/shared/model/Mark.java +++ b/racevisionGame/src/main/java/shared/model/Mark.java @@ -1,6 +1,5 @@ package shared.model; -import mock.model.MockBoat; import mock.model.collider.Collider; import mock.model.collider.Collision; @@ -8,7 +7,7 @@ import mock.model.collider.Collision; * Represents an individual mark. * Has a source ID, name, and position. */ -public class Mark implements Locatable, Collider { +public class Mark extends Collider { /** * The source ID of the mark. @@ -81,21 +80,7 @@ public class Mark implements Locatable, Collider { } @Override - public boolean rayCast(MockBoat boat, double distance) { - double actualDistance = GPSCoordinate.calculateDistanceMeters(boat.getPosition(), this.position); - // Compass direction of collider - Bearing absolute = Bearing.fromAzimuth(GPSCoordinate.calculateAzimuth(boat.getPosition(), this.position)); - // Direction of collider from heading - Bearing relative = Bearing.fromDegrees(absolute.degrees() - boat.getBearing().degrees()); - - if(actualDistance <= distance) { - onCollisionEnter(new Collision(relative, distance)); - return true; - } else return false; - } - - @Override - public boolean rayCast(MockBoat boat) { + public boolean rayCast(Boat boat) { return rayCast(boat, 100); } diff --git a/racevisionGame/src/test/java/mock/model/MockBoatTest.java b/racevisionGame/src/test/java/mock/model/MockBoatTest.java index dcc17f1b..8d1f45ee 100644 --- a/racevisionGame/src/test/java/mock/model/MockBoatTest.java +++ b/racevisionGame/src/test/java/mock/model/MockBoatTest.java @@ -3,7 +3,6 @@ package mock.model; import org.junit.Before; import org.junit.Test; import shared.model.Bearing; -import shared.model.CompoundMark; import shared.model.GPSCoordinate; import shared.model.Mark;