Created ray casting methods for MockBoat and CompoundMark

- Added ColliderRegistry to Race
- Added collision triggering to RaceLogic
- Created basic collision handlers for MockBoat and CompoundMark
This commit is contained in:
cbt24
2017-08-15 12:57:26 +12:00
parent 7474de9816
commit 2fbb96afd7
7 changed files with 73 additions and 50 deletions
@@ -1,6 +1,8 @@
package mock.model;
import mock.model.collider.Collider;
import mock.model.collider.Collision;
import shared.model.*;
@@ -8,7 +10,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 {
public class MockBoat extends Boat implements Collider {
/**
@@ -203,4 +205,19 @@ public class MockBoat extends Boat {
public void setAutoVMG(boolean autoVMG) {
this.autoVMG = autoVMG;
}
@Override
public boolean rayCast(MockBoat boat) {
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));
return true;
} else return false;
}
@Override
public void onCollisionEnter(Collision e) {
System.out.println(e.getBearing().degrees());
}
}
@@ -1,5 +1,6 @@
package mock.model;
import mock.model.collider.ColliderRegistry;
import network.Messages.Enums.BoatStatusEnum;
import network.Messages.LatestMessages;
import org.opengis.geometry.primitive.*;
@@ -30,8 +31,6 @@ public class MockRace extends Race {
*/
private List<MockBoat> boats;
/**
* A copy of the boundary list, except "shrunk" inwards by 50m.
*/
@@ -79,6 +78,8 @@ public class MockRace extends Race {
//Wind.
this.setWind(windGenerator.generateBaselineWind());
this.colliderRegistry.addAllColliders(boats);
}
/**
@@ -1,7 +1,6 @@
package mock.model;
import javafx.animation.AnimationTimer;
import mock.model.commandFactory.Command;
import mock.model.commandFactory.CommandFactory;
import mock.model.commandFactory.CompositeCommand;
import network.Messages.Enums.BoatActionEnum;
@@ -12,7 +11,6 @@ import visualiser.gameController.ControllerServer;
import java.util.Observable;
import java.util.Observer;
import java.util.Stack;
public class RaceLogic implements Observer, Runnable {
/**
@@ -136,7 +134,7 @@ public class RaceLogic implements Observer, Runnable {
if (boat.getStatus() == BoatStatusEnum.RACING) {
commands.execute();
race.updatePosition(boat, framePeriod, race.getRaceClock().getDurationMilli());
race.getColliderRegistry().rayCast(boat);
}
}
@@ -9,10 +9,9 @@ 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);
boolean rayCast(MockBoat boat);
/**
* Handle a collision event
@@ -3,6 +3,7 @@ package mock.model.collider;
import mock.model.MockBoat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
/**
@@ -29,10 +30,14 @@ public class ColliderRegistry implements Collider {
colliders.remove(collider);
}
public void addAllColliders(Collection<? extends Collider> colliders) {
for(Collider collider: colliders) addCollider(collider);
}
@Override
public boolean rayCast(MockBoat boat, Collision collision) {
public boolean rayCast(MockBoat boat) {
for(Collider collider: colliders) {
if(collider.rayCast(boat, collision)) return true;
if(collider.rayCast(boat)) return true;
}
return false;
}