diff --git a/racevisionGame/src/main/java/mock/model/collider/Collider.java b/racevisionGame/src/main/java/mock/model/collider/Collider.java new file mode 100644 index 00000000..ae11d063 --- /dev/null +++ b/racevisionGame/src/main/java/mock/model/collider/Collider.java @@ -0,0 +1,22 @@ +package mock.model.collider; + +import mock.model.MockBoat; + +/** + * Interface for all objects sensitive to collision in a race. + */ +public interface Collider { + /** + * Indicates whether a ray cast from a boat to a target collider triggers a collision. + * @param boat potentially colliding with target + * @param collision details of potential collision + * @return whether or not a collision has occurred + */ + boolean rayCast(MockBoat boat, Collision collision); + + /** + * Handle a collision event + * @param e details of collision + */ + 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 new file mode 100644 index 00000000..e44ef5e1 --- /dev/null +++ b/racevisionGame/src/main/java/mock/model/collider/ColliderRegistry.java @@ -0,0 +1,42 @@ +package mock.model.collider; + +import mock.model.MockBoat; + +import java.util.ArrayList; +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 { + /** + * List of all registered Colliders + */ + private List colliders; + + /** + * Default constructor for ColliderRegistry + */ + public ColliderRegistry() { + this.colliders = new ArrayList<>(); + } + + public void addCollider(Collider collider) { + colliders.add(collider); + } + + public void removeCollider(Collider collider) { + colliders.remove(collider); + } + + @Override + public boolean rayCast(MockBoat boat, Collision collision) { + for(Collider collider: colliders) { + if(collider.rayCast(boat, collision)) return true; + } + return false; + } + + @Override + public void onCollisionEnter(Collision e) {} +} diff --git a/racevisionGame/src/main/java/mock/model/collider/Collision.java b/racevisionGame/src/main/java/mock/model/collider/Collision.java new file mode 100644 index 00000000..5a987bde --- /dev/null +++ b/racevisionGame/src/main/java/mock/model/collider/Collision.java @@ -0,0 +1,35 @@ +package mock.model.collider; + +import shared.model.Bearing; + +/** + * Data structure for holding collision details for ray casting and event handling. + */ +public class Collision { + /** + * Bearing from boat heading to target + */ + private Bearing bearing; + /** + * Distance from boat centre to target centre + */ + private double distance; + + /** + * Constructor for Collision structure + * @param bearing from boat heading to target + * @param distance from boat centre to target centre + */ + public Collision(Bearing bearing, double distance) { + this.bearing = bearing; + this.distance = distance; + } + + public Bearing getBearing() { + return bearing; + } + + public double getDistance() { + return distance; + } +}