diff --git a/racevisionGame/src/main/java/mock/model/MockBoat.java b/racevisionGame/src/main/java/mock/model/MockBoat.java index 24c94531..2a179f7e 100644 --- a/racevisionGame/src/main/java/mock/model/MockBoat.java +++ b/racevisionGame/src/main/java/mock/model/MockBoat.java @@ -207,15 +207,23 @@ public class MockBoat extends Boat implements Collider { } @Override - public boolean rayCast(MockBoat boat) { + public boolean rayCast(MockBoat boat, Collision collision) { double distance = GPSCoordinate.calculateDistanceMeters(boat.getCurrentPosition(), this.getCurrentPosition()); - Bearing bearing = Bearing.fromAzimuth(GPSCoordinate.calculateAzimuth(boat.getCurrentPosition(), this.getCurrentPosition())); - if(distance < 100 && boat != this) { - onCollisionEnter(new Collision(bearing, distance)); + Bearing bearing = GPSCoordinate.calculateBearing(boat.getCurrentPosition(), this.getCurrentPosition()); + + if(distance <= collision.getDistance() && (int)bearing.degrees() == (int)collision.getBearing().degrees()) { + onCollisionEnter(collision); return true; } else return false; } + @Override + public boolean rayCast(MockBoat boat) { + if(boat != this) { + return rayCast(boat, new Collision(Bearing.fromDegrees(0), 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 a443d3f9..479cfc2f 100644 --- a/racevisionGame/src/main/java/mock/model/collider/Collider.java +++ b/racevisionGame/src/main/java/mock/model/collider/Collider.java @@ -7,7 +7,15 @@ import mock.model.MockBoat; */ public interface Collider { /** - * Indicates whether a ray cast from a boat to a target collider triggers a collision. + * Indicates whether a ray cast from a boat to a target collider triggers a collision with the specified parameters. + * @param boat potentially colliding with target + * @param collision parameters of valid collision + * @return whether or not a collision has occurred + */ + boolean rayCast(MockBoat boat, Collision collision); + + /** + * Indicates whether a ray cast from a boat to a target collider triggers a collision. Parameters are set by the object. * @param boat potentially colliding with target * @return whether or not a collision has occurred */ diff --git a/racevisionGame/src/main/java/mock/model/collider/ColliderRegistry.java b/racevisionGame/src/main/java/mock/model/collider/ColliderRegistry.java index e58a28f1..59eb742b 100644 --- a/racevisionGame/src/main/java/mock/model/collider/ColliderRegistry.java +++ b/racevisionGame/src/main/java/mock/model/collider/ColliderRegistry.java @@ -34,6 +34,11 @@ public class ColliderRegistry implements Collider { for(Collider collider: colliders) addCollider(collider); } + @Override + public boolean rayCast(MockBoat boat, Collision collision) { + return false; + } + @Override public boolean rayCast(MockBoat boat) { for(Collider collider: colliders) { diff --git a/racevisionGame/src/main/java/shared/model/CompoundMark.java b/racevisionGame/src/main/java/shared/model/CompoundMark.java index f8080c8d..1787562d 100644 --- a/racevisionGame/src/main/java/shared/model/CompoundMark.java +++ b/racevisionGame/src/main/java/shared/model/CompoundMark.java @@ -5,11 +5,6 @@ import mock.model.MockBoat; import mock.model.collider.Collider; import mock.model.collider.Collision; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.List; - /** * Represents a compound mark - that is, either one or two individual marks which form a single compound mark. */ @@ -151,16 +146,25 @@ public class CompoundMark implements Collider { } @Override - public boolean rayCast(MockBoat boat) { + public boolean rayCast(MockBoat boat, Collision collision) { GPSCoordinate position = boat.getCurrentPosition(); double distance = GPSCoordinate.calculateDistanceMeters(position, closestMark(position).getPosition()); - Bearing bearing = Bearing.fromAzimuth(GPSCoordinate.calculateAzimuth(position, closestMark(position).getPosition())); - if(distance < 100) { - onCollisionEnter(new Collision(bearing, distance)); + // Compass direction of collider + Bearing absolute = Bearing.fromAzimuth(GPSCoordinate.calculateAzimuth(position, closestMark(position).getPosition())); + // Direction of collider from heading + Bearing relative = Bearing.fromDegrees(absolute.degrees() - boat.getBearing().degrees()); + + if(distance <= collision.getDistance() && (int)relative.degrees() == (int)collision.getBearing().degrees()) { + onCollisionEnter(collision); return true; } else return false; } + @Override + public boolean rayCast(MockBoat boat) { + return rayCast(boat, new Collision(Bearing.fromDegrees(0), 100)); + } + @Override public void onCollisionEnter(Collision e) { System.out.println(e.getBearing().degrees()); diff --git a/racevisionGame/src/test/java/mock/model/MockBoatTest.java b/racevisionGame/src/test/java/mock/model/MockBoatTest.java index b1ee551c..61762192 100644 --- a/racevisionGame/src/test/java/mock/model/MockBoatTest.java +++ b/racevisionGame/src/test/java/mock/model/MockBoatTest.java @@ -1,7 +1,37 @@ package mock.model; +import mock.model.collider.Collision; +import org.junit.Before; +import org.junit.Test; +import shared.model.Bearing; +import shared.model.CompoundMark; +import shared.model.GPSCoordinate; +import shared.model.Mark; + import static org.junit.Assert.*; public class MockBoatTest { -//TODO + private MockBoat boat; + private CompoundMark ahead; + private CompoundMark behind; + + @Before + public void setUp() { + boat = new MockBoat(0, "Bob", "NZ", null); + boat.setCurrentPosition(new GPSCoordinate(0,0)); + boat.setBearing(Bearing.fromDegrees(180)); + + ahead = new CompoundMark(0, "Ahead", new Mark(0, "Ahead", new GPSCoordinate(-.0001, 0))); + behind = new CompoundMark(1, "Behind", new Mark(0, "Behind", new GPSCoordinate(.0001, 0))); + } + + @Test + public void markAheadOfBoat0() { + assertTrue(ahead.rayCast(boat, new Collision(Bearing.fromDegrees(0), 100))); + } + + @Test + public void markBehindBoat180() { + assertTrue(behind.rayCast(boat, new Collision(Bearing.fromDegrees(180), 100))); + } }