Bubbles collision events to RaceLogic

- ColliderRegistry collects and forwards all Collision events
- RaceLogic observes the ColliderRegistry of its single Race instance

#story[1100]
main
cbt24 9 years ago
parent 79f3c41d45
commit 8113867576

@ -1,6 +1,8 @@
package mock.model; package mock.model;
import javafx.animation.AnimationTimer; import javafx.animation.AnimationTimer;
import mock.model.collider.Collision;
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;
import network.Messages.Enums.BoatActionEnum; import network.Messages.Enums.BoatActionEnum;
@ -9,8 +11,11 @@ import network.Messages.Enums.RaceStatusEnum;
import network.Messages.LatestMessages; import network.Messages.LatestMessages;
import shared.model.RunnableWithFramePeriod; import shared.model.RunnableWithFramePeriod;
import java.util.Observable;
import java.util.Observer;
public class RaceLogic implements RunnableWithFramePeriod {
public class RaceLogic implements RunnableWithFramePeriod, Observer {
/** /**
* State of current race modified by this object * State of current race modified by this object
*/ */
@ -32,6 +37,8 @@ public class RaceLogic implements RunnableWithFramePeriod {
this.race = race; this.race = race;
this.server = new RaceServer(race, messages); this.server = new RaceServer(race, messages);
this.commands = compositeCommand; this.commands = compositeCommand;
race.getColliderRegistry().addObserver(this);
} }
/** /**
@ -168,4 +175,14 @@ public class RaceLogic implements RunnableWithFramePeriod {
public MockRace getRace() { public MockRace getRace() {
return race; return race;
} }
@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");
}
} }

@ -5,10 +5,12 @@ import shared.model.Boat;
import shared.model.GPSCoordinate; import shared.model.GPSCoordinate;
import shared.model.Locatable; import shared.model.Locatable;
import java.util.Observable;
/** /**
* Interface for all objects sensitive to collision in a race. * Interface for all objects sensitive to collision in a race.
*/ */
public abstract class Collider implements Locatable { public abstract class Collider extends Observable implements Locatable {
/** /**
* Indicates whether a ray cast from a boat to a target collider is within the specified length. * Indicates whether a ray cast from a boat to a target collider is within the specified length.
* @param boat potentially colliding with target * @param boat potentially colliding with target
@ -23,7 +25,13 @@ public abstract class Collider 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) {
onCollisionEnter(new Collision(relative, distance)); Collision collision = new Collision(relative, distance);
// Notify object of collision
onCollisionEnter(collision);
// Notify observers of collision
notifyObservers(collision);
this.setChanged();
return true; return true;
} else return false; } else return false;
} }

@ -3,14 +3,12 @@ package mock.model.collider;
import shared.model.Boat; import shared.model.Boat;
import shared.model.GPSCoordinate; import shared.model.GPSCoordinate;
import java.util.ArrayList; import java.util.*;
import java.util.Collection;
import java.util.List;
/** /**
* Registry for all Collider objects in a MockRace. Wraps the Collider interface as part of a Composite Pattern. * Registry for all Collider objects in a MockRace. Wraps the Collider interface as part of a Composite Pattern.
*/ */
public class ColliderRegistry extends Collider { public class ColliderRegistry extends Collider implements Observer {
/** /**
* List of all registered Colliders * List of all registered Colliders
*/ */
@ -24,6 +22,7 @@ public class ColliderRegistry extends Collider {
} }
public void addCollider(Collider collider) { public void addCollider(Collider collider) {
collider.addObserver(this);
colliders.add(collider); colliders.add(collider);
} }
@ -51,4 +50,17 @@ public class ColliderRegistry extends Collider {
public void setPosition(GPSCoordinate position) { public void setPosition(GPSCoordinate position) {
} }
/**
* Fire onCollisionEnter when collision bubbles up from registered colliders.
* @param o object collided with
* @param arg parameters of the collision
*/
@Override
public void update(Observable o, Object arg) {
Collision collision = (Collision)arg;
notifyObservers(collision);
this.setChanged();
}
} }

@ -401,6 +401,5 @@ public class Boat extends Collider {
@Override @Override
public void onCollisionEnter(Collision e) { public void onCollisionEnter(Collision e) {
System.out.println(e.getBearing().degrees());
} }
} }

@ -86,9 +86,5 @@ public class Mark extends Collider {
@Override @Override
public void onCollisionEnter(Collision e) { public void onCollisionEnter(Collision e) {
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");
} }
} }

Loading…
Cancel
Save