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]
main
cbt24 8 years ago
parent 9cba3934ea
commit a6db06a82c

@ -2,6 +2,7 @@ package mock.model;
import javafx.animation.AnimationTimer; import javafx.animation.AnimationTimer;
import mock.model.collider.Collision; import mock.model.collider.Collision;
import mock.model.commandFactory.CollisionCommand;
import mock.model.commandFactory.Command; import mock.model.commandFactory.Command;
import mock.model.commandFactory.CompositeCommand; import mock.model.commandFactory.CompositeCommand;
import mock.model.commandFactory.CommandFactory; import mock.model.commandFactory.CommandFactory;
@ -222,11 +223,9 @@ public class RaceLogic implements RunnableWithFramePeriod, Observer {
@Override @Override
public void update(Observable o, Object arg) { public void update(Observable o, Object arg) {
Collision e = (Collision)arg; if(arg instanceof Collision) {
Collision collision = (Collision)arg;
// if(e.getBearing().degrees() == 0) System.out.println("Ahead"); commands.addCommand(new CollisionCommand(race, (MockBoat)collision.getBoat()));
// 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");
} }
} }

@ -25,13 +25,9 @@ public abstract class Collider extends Observable implements Locatable {
Bearing relative = Bearing.fromDegrees(absolute.degrees() - boat.getBearing().degrees()); Bearing relative = Bearing.fromDegrees(absolute.degrees() - boat.getBearing().degrees());
if(actualDistance <= distance) { if(actualDistance <= distance) {
Collision collision = new Collision(relative, distance); Collision collision = new Collision(boat, relative, distance);
// Notify object of collision // Notify object of collision
onCollisionEnter(boat, collision); onCollisionEnter(collision);
// Notify observers of collision
notifyObservers(collision);
this.setChanged();
return true; return true;
} else return false; } else return false;
} }
@ -45,8 +41,7 @@ public abstract class Collider extends Observable implements Locatable {
/** /**
* Handle a collision event * Handle a collision event
* @param collider Boat that is colliding
* @param e details of collision * @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; package mock.model.collider;
import mock.model.MockBoat;
import shared.model.Boat; import shared.model.Boat;
import shared.model.GPSCoordinate; import shared.model.GPSCoordinate;
@ -39,7 +40,7 @@ public class ColliderRegistry extends Collider implements Observer {
} }
@Override @Override
public void onCollisionEnter(Boat collider, Collision e) {} public void onCollisionEnter(Collision e) {}
@Override @Override
public GPSCoordinate getPosition() { public GPSCoordinate getPosition() {
@ -60,7 +61,7 @@ public class ColliderRegistry extends Collider implements Observer {
public void update(Observable o, Object arg) { public void update(Observable o, Object arg) {
Collision collision = (Collision)arg; Collision collision = (Collision)arg;
notifyObservers(collision);
this.setChanged(); this.setChanged();
notifyObservers(collision);
} }
} }

@ -1,6 +1,7 @@
package mock.model.collider; package mock.model.collider;
import shared.model.Bearing; import shared.model.Bearing;
import shared.model.Boat;
/** /**
* Data structure for holding collision details for ray casting and event handling. * 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 * Distance from boat centre to target centre
*/ */
private double distance; private double distance;
/**
* Boat involved in the collision
*/
private Boat boat;
/** /**
* Constructor for Collision structure * Constructor for Collision structure
* @param boat involved in collision
* @param bearing from boat heading to target * @param bearing from boat heading to target
* @param distance from boat centre to target centre * @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.bearing = bearing;
this.distance = distance; this.distance = distance;
} }
@ -32,4 +39,8 @@ public class Collision {
public double getDistance() { public double getDistance() {
return distance; 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);
}
}
}

@ -403,10 +403,6 @@ public class Boat extends Collider {
public boolean isSailsOut() { public boolean isSailsOut() {
return sailsOut; return sailsOut;
} }
public void bounce(double repulsionRadius) {
Azimuth reverseAzimuth = Azimuth.fromDegrees(getBearing().degrees() - 180d);
setPosition(GPSCoordinate.calculateNewPosition(getPosition(), 2 * repulsionRadius, reverseAzimuth));
}
@Override @Override
public boolean rayCast(Boat boat) { public boolean rayCast(Boat boat) {
@ -416,9 +412,11 @@ public class Boat extends Collider {
} }
@Override @Override
public void onCollisionEnter(Boat collider, Collision e) { public void onCollisionEnter(Collision e) {
if(e.getBearing().degrees() > 270 || e.getBearing().degrees() < 90) { if(e.getBearing().degrees() > 270 || e.getBearing().degrees() < 90) {
collider.bounce(100); // Notify observers of collision
this.setChanged();
notifyObservers(e);
} }
} }
} }

@ -101,7 +101,8 @@ public class Mark extends Collider{
} }
@Override @Override
public void onCollisionEnter(Boat collider, Collision e) { public void onCollisionEnter(Collision e) {
collider.bounce(repulsionRadius); this.setChanged();
notifyObservers(e);
} }
} }

Loading…
Cancel
Save