From d03460d69e6261b48e9833e125779a6a4b84c243 Mon Sep 17 00:00:00 2001 From: Zhi You Tan Date: Tue, 15 Aug 2017 23:16:25 +1200 Subject: [PATCH] Implemented boat tracking when boat is selected by either clicking or selecting from sidebar combo box. Clicking tracked boat will cancel tracking, but using combobox will always result in one boat being selected. #story[1121] #pair[wmu16, zyt10] --- .../java/seng302/visualiser/GameView.java | 75 ++++++++++++------- .../visualiser/fxObjects/BoatObject.java | 20 +++++ 2 files changed, 68 insertions(+), 27 deletions(-) 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