diff --git a/src/main/java/seng302/visualiser/GameView.java b/src/main/java/seng302/visualiser/GameView.java index 5938524e..82c70f63 100644 --- a/src/main/java/seng302/visualiser/GameView.java +++ b/src/main/java/seng302/visualiser/GameView.java @@ -107,29 +107,36 @@ public class GameView extends Pane { VERTICAL } - public void trackBoat() { - if (this.getScaleX() > 1) { - boolean isBoatSelected = false; - for (BoatObject boat : boatObjects.values()) { - if (boat.getSelected()) { - isBoatSelected = true; - selectedBoat = boat; - double x = boat.getBoatLayoutX(); - double y = boat.getBoatLayoutY(); - double displacementX = this.getWidth(); - double displacementY = this.getHeight(); -// double displacementX = 1200d; -// double displacementY = 900d; - System.out.println("displacementY = " + displacementY); - System.out.println("displacementX = " + displacementX); - this.setLayoutX((-x + (displacementX/2.0)) * this.getScaleX()); - this.setLayoutY((-y + (displacementY/2.0)) * this.getScaleY()); - } - } - if (!isBoatSelected) { - this.setLayoutX(0); - this.setLayoutY(0); - } + private void trackBoat() { + if (selectedBoat != null) { + double x = selectedBoat.getBoatLayoutX(); + double y = selectedBoat.getBoatLayoutY(); + double displacementX = this.getWidth(); + double displacementY = this.getHeight(); + this.setLayoutX((-x + (displacementX / 2.0)) * this.getScaleX()); + this.setLayoutY((-y + (displacementY / 2.0)) * this.getScaleY()); + +// boolean isBoatSelected = false; +// for (BoatObject boat : boatObjects.values()) { +// if (boat.getSelected()) { +// isBoatSelected = true; +// selectedBoat = boat; +// double x = boat.getBoatLayoutX(); +// double y = boat.getBoatLayoutY(); +// double displacementX = this.getWidth(); +// double displacementY = this.getHeight(); +//// double displacementX = 1200d; +//// double displacementY = 900d; +//// System.out.println("displacementY = " + displacementY); +//// System.out.println("displacementX = " + displacementX); +// this.setLayoutX((-x + (displacementX/2.0)) * this.getScaleX()); +// this.setLayoutY((-y + (displacementY/2.0)) * this.getScaleY()); +// } +// } +// if (!isBoatSelected) { +// this.setLayoutX(0); +// this.setLayoutY(0); +// } } else { this.setLayoutX(0); this.setLayoutY(0); @@ -181,9 +188,7 @@ public class GameView extends Pane { lastTime = now; } } -// Platform.runLater(() -> - boatObjects.forEach((boat, boatObject) -> boatObject.updateLocation()); -// ); + boatObjects.forEach((boat, boatObject) -> boatObject.updateLocation()); } }; } @@ -353,6 +358,22 @@ public class GameView extends Pane { // drawGoogleMap(); } + private void setSelectedBoat(BoatObject bo, Boolean isSelected) { + if (this.selectedBoat == bo && !isSelected) { + this.selectedBoat = null; + boatObjects.forEach((boat, group) -> + group.setIsSelected(false) + ); + } else if (isSelected) { + this.selectedBoat = bo; + for (BoatObject group : boatObjects.values()) { + if (group != bo) { + group.setIsSelected(false); + } + } + } + } + /** * Draws all the boats. * @param yachts The yachts to set in the race @@ -363,6 +384,7 @@ public class GameView extends Pane { for (Yacht yacht : yachts) { Paint colour = Colors.getColor(); newBoat = new BoatObject(); + newBoat.addSelectedBoatListener(this::setSelectedBoat); newBoat.setFill(colour); boatObjects.put(yacht, newBoat); createAndBindAnnotationBox(yacht, colour); @@ -598,7 +620,6 @@ public class GameView extends Pane { } public void selectBoat (Yacht selectedYacht) { - selectedBoat = boatObjects.get(selectedYacht); boatObjects.forEach((boat, group) -> group.setIsSelected(boat == selectedYacht) ); diff --git a/src/main/java/seng302/visualiser/fxObjects/BoatObject.java b/src/main/java/seng302/visualiser/fxObjects/BoatObject.java index 31fc9ffd..93e7b1a3 100644 --- a/src/main/java/seng302/visualiser/fxObjects/BoatObject.java +++ b/src/main/java/seng302/visualiser/fxObjects/BoatObject.java @@ -1,6 +1,7 @@ package seng302.visualiser.fxObjects; import java.util.ArrayList; +import java.util.List; import javafx.application.Platform; import javafx.geometry.Point2D; import javafx.scene.Group; @@ -22,6 +23,12 @@ import javafx.scene.transform.Rotate; */ public class BoatObject extends Group { + @FunctionalInterface + public interface SelectedBoatListener { + + void notifySelected(BoatObject boatObject, Boolean isSelected); + } + //Constants for drawing private static final double BOAT_HEIGHT = 15d; private static final double BOAT_WIDTH = 10d; @@ -44,6 +51,8 @@ public class BoatObject extends Group { private Boolean isBeingTracked = false; private boolean isPlayer = false; + private List selectedBoatListenerListeners = new ArrayList<>(); + /** * Creates a BoatGroup with the default triangular boat polygon. */ @@ -287,6 +296,7 @@ public class BoatObject extends Group { // } public void setIsSelected(Boolean isSelected) { + updateListener(isSelected); this.isSelected = isSelected; this.isBeingTracked = isSelected; setLineGroupVisible(isSelected); @@ -381,4 +391,14 @@ public class BoatObject extends Group { // yVelocity = Math.sin(Math.toRadians(heading)) * velocity * scaleFactorY; lastHeading = heading; } + + private void updateListener(Boolean isSelected) { + for (SelectedBoatListener sbl : selectedBoatListenerListeners) { + sbl.notifySelected(this, isSelected); + } + } + + public void addSelectedBoatListener(SelectedBoatListener sbl) { + selectedBoatListenerListeners.add(sbl); + } } \ No newline at end of file