Moved generic ray casting to Collider abstract class

- Boat is now collider
- Collider subclasses specify their own collision ray and collision handler

#story[1100]
main
cbt24 8 years ago
parent f44929f376
commit 79f3c41d45

@ -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;

Loading…
Cancel
Save