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 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);
}
}
}

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

Loading…
Cancel
Save