Boats now reverse smoothly when colliding
- Collision objects specify which boat is colliding - RaceLogic sets up an observable CollisionCommand when collision bubbles up - Boats now selectively identify observers of collision #story[1196]
This commit is contained in:
@@ -2,6 +2,7 @@ package mock.model;
|
||||
|
||||
import javafx.animation.AnimationTimer;
|
||||
import mock.model.collider.Collision;
|
||||
import mock.model.commandFactory.CollisionCommand;
|
||||
import mock.model.commandFactory.Command;
|
||||
import mock.model.commandFactory.CompositeCommand;
|
||||
import mock.model.commandFactory.CommandFactory;
|
||||
@@ -222,11 +223,9 @@ public class RaceLogic implements RunnableWithFramePeriod, Observer {
|
||||
|
||||
@Override
|
||||
public void update(Observable o, Object arg) {
|
||||
Collision e = (Collision)arg;
|
||||
|
||||
// if(e.getBearing().degrees() == 0) System.out.println("Ahead");
|
||||
// else if(e.getBearing().degrees() < 90) System.out.println("Starboard");
|
||||
// else if(e.getBearing().degrees() > 270) System.out.println("Port");
|
||||
// else System.out.println("Behind");
|
||||
if(arg instanceof Collision) {
|
||||
Collision collision = (Collision)arg;
|
||||
commands.addCommand(new CollisionCommand(race, (MockBoat)collision.getBoat()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -25,13 +25,9 @@ public abstract class Collider extends Observable implements Locatable {
|
||||
Bearing relative = Bearing.fromDegrees(absolute.degrees() - boat.getBearing().degrees());
|
||||
|
||||
if(actualDistance <= distance) {
|
||||
Collision collision = new Collision(relative, distance);
|
||||
Collision collision = new Collision(boat, relative, distance);
|
||||
// Notify object of collision
|
||||
onCollisionEnter(boat, collision);
|
||||
// Notify observers of collision
|
||||
notifyObservers(collision);
|
||||
this.setChanged();
|
||||
|
||||
onCollisionEnter(collision);
|
||||
return true;
|
||||
} else return false;
|
||||
}
|
||||
@@ -45,8 +41,7 @@ public abstract class Collider extends Observable implements Locatable {
|
||||
|
||||
/**
|
||||
* Handle a collision event
|
||||
* @param collider Boat that is colliding
|
||||
* @param e details of collision
|
||||
*/
|
||||
public abstract void onCollisionEnter(Boat collider, Collision e);
|
||||
public abstract void onCollisionEnter(Collision e);
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package mock.model.collider;
|
||||
|
||||
import mock.model.MockBoat;
|
||||
import shared.model.Boat;
|
||||
import shared.model.GPSCoordinate;
|
||||
|
||||
@@ -39,7 +40,7 @@ public class ColliderRegistry extends Collider implements Observer {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCollisionEnter(Boat collider, Collision e) {}
|
||||
public void onCollisionEnter(Collision e) {}
|
||||
|
||||
@Override
|
||||
public GPSCoordinate getPosition() {
|
||||
@@ -60,7 +61,7 @@ public class ColliderRegistry extends Collider implements Observer {
|
||||
public void update(Observable o, Object arg) {
|
||||
Collision collision = (Collision)arg;
|
||||
|
||||
notifyObservers(collision);
|
||||
this.setChanged();
|
||||
notifyObservers(collision);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package mock.model.collider;
|
||||
|
||||
import shared.model.Bearing;
|
||||
import shared.model.Boat;
|
||||
|
||||
/**
|
||||
* Data structure for holding collision details for ray casting and event handling.
|
||||
@@ -14,13 +15,19 @@ public class Collision {
|
||||
* Distance from boat centre to target centre
|
||||
*/
|
||||
private double distance;
|
||||
/**
|
||||
* Boat involved in the collision
|
||||
*/
|
||||
private Boat boat;
|
||||
|
||||
/**
|
||||
* Constructor for Collision structure
|
||||
* @param boat involved in collision
|
||||
* @param bearing from boat heading to target
|
||||
* @param distance from boat centre to target centre
|
||||
*/
|
||||
public Collision(Bearing bearing, double distance) {
|
||||
public Collision(Boat boat, Bearing bearing, double distance) {
|
||||
this.boat = boat;
|
||||
this.bearing = bearing;
|
||||
this.distance = distance;
|
||||
}
|
||||
@@ -32,4 +39,8 @@ public class Collision {
|
||||
public double getDistance() {
|
||||
return distance;
|
||||
}
|
||||
|
||||
public Boat getBoat() {
|
||||
return boat;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,39 @@
|
||||
package mock.model.commandFactory;
|
||||
|
||||
import mock.model.MockBoat;
|
||||
import mock.model.MockRace;
|
||||
import shared.model.Azimuth;
|
||||
import shared.model.GPSCoordinate;
|
||||
|
||||
import java.util.Observable;
|
||||
|
||||
/**
|
||||
* Created by cbt24 on 7/09/17.
|
||||
*/
|
||||
public class CollisionCommand extends ObserverCommand {
|
||||
private GPSCoordinate startingPosition;
|
||||
private Azimuth azimuth;
|
||||
private double distance;
|
||||
|
||||
public CollisionCommand(MockRace race, MockBoat boat) {
|
||||
super(race, boat);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute() {
|
||||
this.azimuth = Azimuth.fromDegrees(boat.getBearing().degrees() - 180d);
|
||||
this.startingPosition = boat.getPosition();
|
||||
this.distance = 30;
|
||||
boat.setVelocityDefault(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update(Observable o, Object arg) {
|
||||
if(GPSCoordinate.calculateDistanceMeters(boat.getPosition(), startingPosition) < distance) {
|
||||
boat.setPosition(GPSCoordinate.calculateNewPosition(boat.getPosition(), 2, azimuth));
|
||||
} else {
|
||||
race.deleteObserver(this);
|
||||
boat.setVelocityDefault(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user