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]
This commit is contained in:
Zhi You Tan
2017-08-15 23:16:25 +12:00
parent 7fbecc8b3d
commit d03460d69e
2 changed files with 68 additions and 27 deletions
+43 -22
View File
@@ -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();
private void trackBoat() {
if (selectedBoat != null) {
double x = selectedBoat.getBoatLayoutX();
double y = selectedBoat.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);
}
// 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());
// );
}
};
}
@@ -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)
);
@@ -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<SelectedBoatListener> 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);
}
}