Moved generic ray casting to Collider abstract class
- Boat is now collider - Collider subclasses specify their own collision ray and collision handler #story[1100]
This commit is contained in:
@@ -1,8 +1,5 @@
|
|||||||
package mock.model;
|
package mock.model;
|
||||||
|
|
||||||
|
|
||||||
import mock.model.collider.Collider;
|
|
||||||
import mock.model.collider.Collision;
|
|
||||||
import shared.model.*;
|
import shared.model.*;
|
||||||
|
|
||||||
|
|
||||||
@@ -10,7 +7,7 @@ import shared.model.*;
|
|||||||
* Represents a Boat on the mock side of a race.
|
* Represents a Boat on the mock side of a race.
|
||||||
* This adds mock specific functionality to a boat.
|
* 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) {
|
public void setAutoVMG(boolean autoVMG) {
|
||||||
this.autoVMG = 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());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,29 +1,43 @@
|
|||||||
package mock.model.collider;
|
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.
|
* 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.
|
* Indicates whether a ray cast from a boat to a target collider is within the specified length.
|
||||||
* @param boat potentially colliding with target
|
* @param boat potentially colliding with target
|
||||||
* @param distance distance for valid collision
|
* @param distance distance for valid collision
|
||||||
* @return whether or not a collision has occurred
|
* @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.
|
* 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
|
* @param boat potentially colliding with target
|
||||||
* @return whether or not a collision has occurred
|
* @return whether or not a collision has occurred
|
||||||
*/
|
*/
|
||||||
boolean rayCast(MockBoat boat);
|
public abstract boolean rayCast(Boat boat);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handle a collision event
|
* Handle a collision event
|
||||||
* @param e details of collision
|
* @param e details of collision
|
||||||
*/
|
*/
|
||||||
void onCollisionEnter(Collision e);
|
public abstract void onCollisionEnter(Collision e);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package mock.model.collider;
|
package mock.model.collider;
|
||||||
|
|
||||||
import mock.model.MockBoat;
|
import shared.model.Boat;
|
||||||
|
import shared.model.GPSCoordinate;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
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.
|
* 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
|
* List of all registered Colliders
|
||||||
*/
|
*/
|
||||||
@@ -26,21 +27,12 @@ public class ColliderRegistry implements Collider {
|
|||||||
colliders.add(collider);
|
colliders.add(collider);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void removeCollider(Collider collider) {
|
|
||||||
colliders.remove(collider);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void addAllColliders(Collection<? extends Collider> colliders) {
|
public void addAllColliders(Collection<? extends Collider> colliders) {
|
||||||
for(Collider collider: colliders) addCollider(collider);
|
for(Collider collider: colliders) addCollider(collider);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean rayCast(MockBoat boat, double distance) {
|
public boolean rayCast(Boat boat) {
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean rayCast(MockBoat boat) {
|
|
||||||
for(Collider collider: colliders) {
|
for(Collider collider: colliders) {
|
||||||
if(collider.rayCast(boat)) return true;
|
if(collider.rayCast(boat)) return true;
|
||||||
}
|
}
|
||||||
@@ -49,4 +41,14 @@ public class ColliderRegistry implements Collider {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCollisionEnter(Collision e) {}
|
public void onCollisionEnter(Collision e) {}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public GPSCoordinate getPosition() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setPosition(GPSCoordinate position) {
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,8 @@ package shared.model;
|
|||||||
|
|
||||||
|
|
||||||
import javafx.beans.property.*;
|
import javafx.beans.property.*;
|
||||||
|
import mock.model.collider.Collider;
|
||||||
|
import mock.model.collider.Collision;
|
||||||
import network.Messages.Enums.BoatStatusEnum;
|
import network.Messages.Enums.BoatStatusEnum;
|
||||||
import org.jetbrains.annotations.Nullable;
|
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.
|
* 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.
|
* The name of the boat/team.
|
||||||
*/
|
*/
|
||||||
@@ -390,4 +392,15 @@ public class Boat implements Locatable {
|
|||||||
this.timeAtLastMark = timeAtLastMark;
|
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());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
package shared.model;
|
package shared.model;
|
||||||
|
|
||||||
import mock.model.MockBoat;
|
|
||||||
import mock.model.collider.Collider;
|
import mock.model.collider.Collider;
|
||||||
import mock.model.collider.Collision;
|
import mock.model.collider.Collision;
|
||||||
|
|
||||||
@@ -8,7 +7,7 @@ import mock.model.collider.Collision;
|
|||||||
* Represents an individual mark.
|
* Represents an individual mark.
|
||||||
* Has a source ID, name, and position.
|
* Has a source ID, name, and position.
|
||||||
*/
|
*/
|
||||||
public class Mark implements Locatable, Collider {
|
public class Mark extends Collider {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The source ID of the mark.
|
* The source ID of the mark.
|
||||||
@@ -81,21 +80,7 @@ public class Mark implements Locatable, Collider {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean rayCast(MockBoat boat, double distance) {
|
public boolean rayCast(Boat boat) {
|
||||||
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) {
|
|
||||||
return rayCast(boat, 100);
|
return rayCast(boat, 100);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ package mock.model;
|
|||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import shared.model.Bearing;
|
import shared.model.Bearing;
|
||||||
import shared.model.CompoundMark;
|
|
||||||
import shared.model.GPSCoordinate;
|
import shared.model.GPSCoordinate;
|
||||||
import shared.model.Mark;
|
import shared.model.Mark;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user