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 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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user