mirror of
https://github.com/michaelrausch/Party-Parrots-At-Sea.git
synced 2026-05-09 14:28:43 +00:00
Implemented elapsed time since last mark on annotation.
#story[927]
This commit is contained in:
@@ -34,6 +34,7 @@ import java.util.*;
|
|||||||
* Created by ptg19 on 29/03/17.
|
* Created by ptg19 on 29/03/17.
|
||||||
*/
|
*/
|
||||||
public class RaceViewController extends Thread implements ImportantAnnotationDelegate {
|
public class RaceViewController extends Thread implements ImportantAnnotationDelegate {
|
||||||
|
|
||||||
@FXML
|
@FXML
|
||||||
private VBox positionVbox;
|
private VBox positionVbox;
|
||||||
@FXML
|
@FXML
|
||||||
@@ -85,6 +86,7 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* The important annotations have been changed, update this view
|
* The important annotations have been changed, update this view
|
||||||
|
*
|
||||||
* @param importantAnnotationsState The current state of the selected annotations
|
* @param importantAnnotationsState The current state of the selected annotations
|
||||||
*/
|
*/
|
||||||
public void importantAnnotationsChanged(ImportantAnnotationsState importantAnnotationsState) {
|
public void importantAnnotationsChanged(ImportantAnnotationsState importantAnnotationsState) {
|
||||||
@@ -101,12 +103,14 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel
|
|||||||
Stage stage = new Stage();
|
Stage stage = new Stage();
|
||||||
|
|
||||||
// Set controller
|
// Set controller
|
||||||
ImportantAnnotationController controller = new ImportantAnnotationController(this, stage);
|
ImportantAnnotationController controller = new ImportantAnnotationController(this,
|
||||||
|
stage);
|
||||||
fxmlLoader.setController(controller);
|
fxmlLoader.setController(controller);
|
||||||
|
|
||||||
// Load FXML and set CSS
|
// Load FXML and set CSS
|
||||||
fxmlLoader.setLocation(getClass().getResource("/views/importantAnnotationSelectView.fxml"));
|
fxmlLoader
|
||||||
Scene scene = new Scene(fxmlLoader.load(), 469, 248);
|
.setLocation(getClass().getResource("/views/importantAnnotationSelectView.fxml"));
|
||||||
|
Scene scene = new Scene(fxmlLoader.load(), 469, 270);
|
||||||
scene.getStylesheets().add(getClass().getResource("/css/master.css").toString());
|
scene.getStylesheets().add(getClass().getResource("/css/master.css").toString());
|
||||||
stage.initStyle(StageStyle.UNDECORATED);
|
stage.initStyle(StageStyle.UNDECORATED);
|
||||||
|
|
||||||
@@ -125,7 +129,8 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel
|
|||||||
|
|
||||||
toggleFps.selectedProperty().addListener(new ChangeListener<Boolean>() {
|
toggleFps.selectedProperty().addListener(new ChangeListener<Boolean>() {
|
||||||
@Override
|
@Override
|
||||||
public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
|
public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue,
|
||||||
|
Boolean newValue) {
|
||||||
displayFps = !displayFps;
|
displayFps = !displayFps;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -134,10 +139,18 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel
|
|||||||
annotationSlider.setLabelFormatter(new StringConverter<Double>() {
|
annotationSlider.setLabelFormatter(new StringConverter<Double>() {
|
||||||
@Override
|
@Override
|
||||||
public String toString(Double n) {
|
public String toString(Double n) {
|
||||||
if (n == 0) return "None";
|
if (n == 0) {
|
||||||
if (n == 1) return "Low";
|
return "None";
|
||||||
if (n == 2) return "Important";
|
}
|
||||||
if (n == 3) return "All";
|
if (n == 1) {
|
||||||
|
return "Low";
|
||||||
|
}
|
||||||
|
if (n == 2) {
|
||||||
|
return "Important";
|
||||||
|
}
|
||||||
|
if (n == 3) {
|
||||||
|
return "All";
|
||||||
|
}
|
||||||
|
|
||||||
return "All";
|
return "All";
|
||||||
}
|
}
|
||||||
@@ -192,7 +205,8 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel
|
|||||||
windDirTimeline.getKeyFrames().add(
|
windDirTimeline.getKeyFrames().add(
|
||||||
new KeyFrame(Duration.seconds(1),
|
new KeyFrame(Duration.seconds(1),
|
||||||
event -> {
|
event -> {
|
||||||
windDirectionText.setText(String.format("%.1f°", StreamParser.getWindDirection()));
|
windDirectionText
|
||||||
|
.setText(String.format("%.1f°", StreamParser.getWindDirection()));
|
||||||
windArrowText.setRotate(StreamParser.getWindDirection());
|
windArrowText.setRotate(StreamParser.getWindDirection());
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
@@ -291,6 +305,7 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel
|
|||||||
public void stopTimer() {
|
public void stopTimer() {
|
||||||
timerTimeline.stop();
|
timerTimeline.stop();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void startTimer() {
|
public void startTimer() {
|
||||||
timerTimeline.play();
|
timerTimeline.play();
|
||||||
}
|
}
|
||||||
@@ -309,43 +324,45 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Display the important annotations for a specific BoatGroup
|
* Display the important annotations for a specific BoatGroup
|
||||||
|
*
|
||||||
* @param bg The boat group to set the annotations for
|
* @param bg The boat group to set the annotations for
|
||||||
*/
|
*/
|
||||||
private void setBoatGroupImportantAnnotations(BoatGroup bg) {
|
private void setBoatGroupImportantAnnotations(BoatGroup bg) {
|
||||||
if (importantAnnotations.getAnnotationState(Annotation.NAME)) {
|
if (importantAnnotations.getAnnotationState(Annotation.NAME)) {
|
||||||
bg.setTeamNameObjectVisible(true);
|
bg.setTeamNameObjectVisible(true);
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
bg.setTeamNameObjectVisible(false);
|
bg.setTeamNameObjectVisible(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (importantAnnotations.getAnnotationState(Annotation.SPEED)) {
|
if (importantAnnotations.getAnnotationState(Annotation.SPEED)) {
|
||||||
bg.setVelocityObjectVisible(true);
|
bg.setVelocityObjectVisible(true);
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
bg.setVelocityObjectVisible(false);
|
bg.setVelocityObjectVisible(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (importantAnnotations.getAnnotationState(Annotation.TRACK)) {
|
if (importantAnnotations.getAnnotationState(Annotation.TRACK)) {
|
||||||
bg.setLineGroupVisible(true);
|
bg.setLineGroupVisible(true);
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
bg.setLineGroupVisible(false);
|
bg.setLineGroupVisible(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (importantAnnotations.getAnnotationState(Annotation.WAKE)) {
|
if (importantAnnotations.getAnnotationState(Annotation.WAKE)) {
|
||||||
bg.setWakeVisible(true);
|
bg.setWakeVisible(true);
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
bg.setWakeVisible(false);
|
bg.setWakeVisible(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (importantAnnotations.getAnnotationState(Annotation.ESTTIMETONEXTMARK)) {
|
if (importantAnnotations.getAnnotationState(Annotation.ESTTIMETONEXTMARK)) {
|
||||||
bg.setEstTimeToNextMarkObjectVisible(true);
|
bg.setEstTimeToNextMarkObjectVisible(true);
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
bg.setEstTimeToNextMarkObjectVisible(false);
|
bg.setEstTimeToNextMarkObjectVisible(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (importantAnnotations.getAnnotationState(Annotation.LEGTIME)) {
|
||||||
|
bg.setLegTimeObjectVisible(true);
|
||||||
|
} else {
|
||||||
|
bg.setLegTimeObjectVisible(false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setAnnotations(Integer annotationLevel) {
|
private void setAnnotations(Integer annotationLevel) {
|
||||||
@@ -358,6 +375,7 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel
|
|||||||
bg.setTeamNameObjectVisible(false);
|
bg.setTeamNameObjectVisible(false);
|
||||||
bg.setVelocityObjectVisible(false);
|
bg.setVelocityObjectVisible(false);
|
||||||
bg.setEstTimeToNextMarkObjectVisible(false);
|
bg.setEstTimeToNextMarkObjectVisible(false);
|
||||||
|
bg.setLegTimeObjectVisible(false);
|
||||||
bg.setLineGroupVisible(false);
|
bg.setLineGroupVisible(false);
|
||||||
bg.setWakeVisible(false);
|
bg.setWakeVisible(false);
|
||||||
}
|
}
|
||||||
@@ -371,6 +389,7 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel
|
|||||||
bg.setTeamNameObjectVisible(true);
|
bg.setTeamNameObjectVisible(true);
|
||||||
bg.setVelocityObjectVisible(false);
|
bg.setVelocityObjectVisible(false);
|
||||||
bg.setEstTimeToNextMarkObjectVisible(false);
|
bg.setEstTimeToNextMarkObjectVisible(false);
|
||||||
|
bg.setLegTimeObjectVisible(false);
|
||||||
bg.setLineGroupVisible(false);
|
bg.setLineGroupVisible(false);
|
||||||
bg.setWakeVisible(false);
|
bg.setWakeVisible(false);
|
||||||
}
|
}
|
||||||
@@ -393,6 +412,7 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel
|
|||||||
bg.setTeamNameObjectVisible(true);
|
bg.setTeamNameObjectVisible(true);
|
||||||
bg.setVelocityObjectVisible(true);
|
bg.setVelocityObjectVisible(true);
|
||||||
bg.setEstTimeToNextMarkObjectVisible(true);
|
bg.setEstTimeToNextMarkObjectVisible(true);
|
||||||
|
bg.setLegTimeObjectVisible(true);
|
||||||
bg.setLineGroupVisible(true);
|
bg.setLineGroupVisible(true);
|
||||||
bg.setWakeVisible(true);
|
bg.setWakeVisible(true);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,5 +8,6 @@ public enum Annotation {
|
|||||||
WAKE,
|
WAKE,
|
||||||
TRACK,
|
TRACK,
|
||||||
NAME,
|
NAME,
|
||||||
ESTTIMETONEXTMARK
|
ESTTIMETONEXTMARK,
|
||||||
|
LEGTIME
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ import java.util.Map;
|
|||||||
import java.util.ResourceBundle;
|
import java.util.ResourceBundle;
|
||||||
|
|
||||||
public class ImportantAnnotationController implements Initializable {
|
public class ImportantAnnotationController implements Initializable {
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* JavaFX Outlets
|
* JavaFX Outlets
|
||||||
*/
|
*/
|
||||||
@@ -33,6 +34,9 @@ public class ImportantAnnotationController implements Initializable {
|
|||||||
@FXML
|
@FXML
|
||||||
private CheckBox boatEstTimeToNextMarkSelect;
|
private CheckBox boatEstTimeToNextMarkSelect;
|
||||||
|
|
||||||
|
@FXML
|
||||||
|
private CheckBox boatElapsedTimeSelect;
|
||||||
|
|
||||||
@FXML
|
@FXML
|
||||||
private AnchorPane annotationSelectWindow;
|
private AnchorPane annotationSelectWindow;
|
||||||
|
|
||||||
@@ -52,6 +56,7 @@ public class ImportantAnnotationController implements Initializable {
|
|||||||
/**
|
/**
|
||||||
* Sets whether or not an annotation is considered important, then
|
* Sets whether or not an annotation is considered important, then
|
||||||
* sends an update to the delegate
|
* sends an update to the delegate
|
||||||
|
*
|
||||||
* @param annotation The annotation
|
* @param annotation The annotation
|
||||||
* @param isSet True if annotation is important
|
* @param isSet True if annotation is important
|
||||||
*/
|
*/
|
||||||
@@ -70,6 +75,7 @@ public class ImportantAnnotationController implements Initializable {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Load the current state of the 'important annotations'
|
* Load the current state of the 'important annotations'
|
||||||
|
*
|
||||||
* @param currentState hashmap containing the states of each annotation
|
* @param currentState hashmap containing the states of each annotation
|
||||||
*/
|
*/
|
||||||
public void loadState(ImportantAnnotationsState currentState) {
|
public void loadState(ImportantAnnotationsState currentState) {
|
||||||
@@ -79,25 +85,34 @@ public class ImportantAnnotationController implements Initializable {
|
|||||||
for (Annotation annotation : importantAnnotationsState.getAnnotations()) {
|
for (Annotation annotation : importantAnnotationsState.getAnnotations()) {
|
||||||
switch (annotation) {
|
switch (annotation) {
|
||||||
case WAKE:
|
case WAKE:
|
||||||
boatWakeSelect.setSelected(importantAnnotationsState.getAnnotationState(annotation));
|
boatWakeSelect
|
||||||
|
.setSelected(importantAnnotationsState.getAnnotationState(annotation));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SPEED:
|
case SPEED:
|
||||||
boatSpeedSelect.setSelected(importantAnnotationsState.getAnnotationState(annotation));
|
boatSpeedSelect
|
||||||
|
.setSelected(importantAnnotationsState.getAnnotationState(annotation));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TRACK:
|
case TRACK:
|
||||||
boatTrackSelect.setSelected(importantAnnotationsState.getAnnotationState(annotation));
|
boatTrackSelect
|
||||||
|
.setSelected(importantAnnotationsState.getAnnotationState(annotation));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case NAME:
|
case NAME:
|
||||||
boatNameSelect.setSelected(importantAnnotationsState.getAnnotationState(annotation));
|
boatNameSelect
|
||||||
|
.setSelected(importantAnnotationsState.getAnnotationState(annotation));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ESTTIMETONEXTMARK:
|
case ESTTIMETONEXTMARK:
|
||||||
boatEstTimeToNextMarkSelect.setSelected(importantAnnotationsState.getAnnotationState(annotation));
|
boatEstTimeToNextMarkSelect
|
||||||
|
.setSelected(importantAnnotationsState.getAnnotationState(annotation));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case LEGTIME:
|
||||||
|
boatElapsedTimeSelect
|
||||||
|
.setSelected(importantAnnotationsState.getAnnotationState(annotation));
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -106,16 +121,24 @@ public class ImportantAnnotationController implements Initializable {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* View did load
|
* View did load
|
||||||
|
*
|
||||||
* @param location .
|
* @param location .
|
||||||
* @param resources .
|
* @param resources .
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void initialize(URL location, ResourceBundle resources) {
|
public void initialize(URL location, ResourceBundle resources) {
|
||||||
boatWakeSelect.setOnAction(event -> setAnnotation(Annotation.WAKE, boatWakeSelect.isSelected()));
|
boatWakeSelect
|
||||||
boatSpeedSelect.setOnAction(event -> setAnnotation(Annotation.SPEED, boatSpeedSelect.isSelected()));
|
.setOnAction(event -> setAnnotation(Annotation.WAKE, boatWakeSelect.isSelected()));
|
||||||
boatTrackSelect.setOnAction(event -> setAnnotation(Annotation.TRACK, boatTrackSelect.isSelected()));
|
boatSpeedSelect
|
||||||
boatNameSelect.setOnAction(event -> setAnnotation(Annotation.NAME, boatNameSelect.isSelected()));
|
.setOnAction(event -> setAnnotation(Annotation.SPEED, boatSpeedSelect.isSelected()));
|
||||||
boatEstTimeToNextMarkSelect.setOnAction(event -> setAnnotation(Annotation.ESTTIMETONEXTMARK, boatEstTimeToNextMarkSelect.isSelected()));
|
boatTrackSelect
|
||||||
|
.setOnAction(event -> setAnnotation(Annotation.TRACK, boatTrackSelect.isSelected()));
|
||||||
|
boatNameSelect
|
||||||
|
.setOnAction(event -> setAnnotation(Annotation.NAME, boatNameSelect.isSelected()));
|
||||||
|
boatEstTimeToNextMarkSelect.setOnAction(event -> setAnnotation(Annotation.ESTTIMETONEXTMARK,
|
||||||
|
boatEstTimeToNextMarkSelect.isSelected()));
|
||||||
|
boatElapsedTimeSelect.setOnAction(
|
||||||
|
event -> setAnnotation(Annotation.LEGTIME, boatElapsedTimeSelect.isSelected()));
|
||||||
|
|
||||||
closeButton.setOnAction(event -> stage.close());
|
closeButton.setOnAction(event -> stage.close());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,11 +16,12 @@ import java.util.ArrayList;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* BoatGroup is a javafx group that by default contains a graphical objects for representing a 2 dimensional boat.
|
* BoatGroup is a javafx group that by default contains a graphical objects for representing a 2
|
||||||
* It contains a single polygon for the boat, a group of lines to show it's path, a wake object and two text labels to
|
* dimensional boat. It contains a single polygon for the boat, a group of lines to show it's path,
|
||||||
* annotate the boat teams name and the boats velocity. The boat will update it's position onscreen everytime
|
* a wake object and two text labels to annotate the boat teams name and the boats velocity. The
|
||||||
* UpdatePosition is called unless the window is minimized in which case it attempts to store animations and apply them
|
* boat will update it's position onscreen everytime UpdatePosition is called unless the window is
|
||||||
* when the window is maximised.
|
* minimized in which case it attempts to store animations and apply them when the window is
|
||||||
|
* maximised.
|
||||||
*/
|
*/
|
||||||
public class BoatGroup extends RaceObject {
|
public class BoatGroup extends RaceObject {
|
||||||
|
|
||||||
@@ -59,8 +60,9 @@ public class BoatGroup extends RaceObject{
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a BoatGroup with the default triangular boat polygon.
|
* Creates a BoatGroup with the default triangular boat polygon.
|
||||||
* @param boat The boat that the BoatGroup will represent. Must contain an ID which will be used to tell which
|
*
|
||||||
* BoatGroup to update.
|
* @param boat The boat that the BoatGroup will represent. Must contain an ID which will be used
|
||||||
|
* to tell which BoatGroup to update.
|
||||||
* @param color The colour of the boat polygon and the trailing line.
|
* @param color The colour of the boat polygon and the trailing line.
|
||||||
*/
|
*/
|
||||||
public BoatGroup(Yacht boat, Color color) {
|
public BoatGroup(Yacht boat, Color color) {
|
||||||
@@ -69,22 +71,26 @@ public class BoatGroup extends RaceObject{
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a BoatGroup with the boat being the default polygon. The head of the boat should be at point (0,0).
|
* Creates a BoatGroup with the boat being the default polygon. The head of the boat should be
|
||||||
* @param boat The boat that the BoatGroup will represent. Must contain an ID which will be used to tell which
|
* at point (0,0).
|
||||||
* BoatGroup to update.
|
*
|
||||||
|
* @param boat The boat that the BoatGroup will represent. Must contain an ID which will be used
|
||||||
|
* to tell which BoatGroup to update.
|
||||||
* @param color The colour of the boat polygon and the trailing line.
|
* @param color The colour of the boat polygon and the trailing line.
|
||||||
* @param points An array of co-ordinates x1,y1,x2,y2,x3,y3... that will make up the boat polygon.
|
* @param points An array of co-ordinates x1,y1,x2,y2,x3,y3... that will make up the boat
|
||||||
|
* polygon.
|
||||||
*/
|
*/
|
||||||
public BoatGroup (Yacht boat, Color color, double... points)
|
public BoatGroup(Yacht boat, Color color, double... points) {
|
||||||
{
|
|
||||||
this.boat = boat;
|
this.boat = boat;
|
||||||
initChildren(color, points);
|
initChildren(color, points);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates the javafx objects that will be the in the group by default.
|
* Creates the javafx objects that will be the in the group by default.
|
||||||
|
*
|
||||||
* @param color The colour of the boat polygon and the trailing line.
|
* @param color The colour of the boat polygon and the trailing line.
|
||||||
* @param points An array of co-ordinates x1,y1,x2,y2,x3,y3... that will make up the boat polygon.
|
* @param points An array of co-ordinates x1,y1,x2,y2,x3,y3... that will make up the boat
|
||||||
|
* polygon.
|
||||||
*/
|
*/
|
||||||
private void initChildren(Color color, double... points) {
|
private void initChildren(Color color, double... points) {
|
||||||
boatPoly = new Polygon(points);
|
boatPoly = new Polygon(points);
|
||||||
@@ -92,11 +98,17 @@ public class BoatGroup extends RaceObject{
|
|||||||
|
|
||||||
teamNameObject = new Text(boat.getShortName());
|
teamNameObject = new Text(boat.getShortName());
|
||||||
velocityObject = new Text(String.valueOf(boat.getVelocity()));
|
velocityObject = new Text(String.valueOf(boat.getVelocity()));
|
||||||
estTimeToNextMarkObject = new Text(String.valueOf(boat.getEstimateTimeAtNextMark()));
|
|
||||||
legTimeObject = new Text(String.valueOf(boat.getMarkRoundingTime()));
|
|
||||||
DateFormat format = new SimpleDateFormat("mm:ss");
|
DateFormat format = new SimpleDateFormat("mm:ss");
|
||||||
String timeToNextMark = format.format(boat.getEstimateTimeAtNextMark() - StreamParser.getCurrentTimeLong());
|
String timeToNextMark = format
|
||||||
|
.format(boat.getEstimateTimeAtNextMark() - StreamParser.getCurrentTimeLong());
|
||||||
estTimeToNextMarkObject = new Text("Next mark: " + timeToNextMark);
|
estTimeToNextMarkObject = new Text("Next mark: " + timeToNextMark);
|
||||||
|
if (boat.getMarkRoundingTime() != null) {
|
||||||
|
String elapsedTime = format
|
||||||
|
.format(StreamParser.getCurrentTimeLong() - boat.getMarkRoundingTime());
|
||||||
|
legTimeObject = new Text("Last mark: " + elapsedTime);
|
||||||
|
} else {
|
||||||
|
legTimeObject = new Text("Last mark: -");
|
||||||
|
}
|
||||||
|
|
||||||
teamNameObject.setX(TEAMNAME_X_OFFSET);
|
teamNameObject.setX(TEAMNAME_X_OFFSET);
|
||||||
teamNameObject.setY(TEAMNAME_Y_OFFSET);
|
teamNameObject.setY(TEAMNAME_Y_OFFSET);
|
||||||
@@ -109,18 +121,22 @@ public class BoatGroup extends RaceObject{
|
|||||||
|
|
||||||
estTimeToNextMarkObject.setX(ESTTIMETONEXTMARK_X_OFFSET);
|
estTimeToNextMarkObject.setX(ESTTIMETONEXTMARK_X_OFFSET);
|
||||||
estTimeToNextMarkObject.setY(ESTTIMETONEXTMARK_Y_OFFSET);
|
estTimeToNextMarkObject.setY(ESTTIMETONEXTMARK_Y_OFFSET);
|
||||||
estTimeToNextMarkObject.relocate(estTimeToNextMarkObject.getX(), estTimeToNextMarkObject.getY());
|
estTimeToNextMarkObject
|
||||||
|
.relocate(estTimeToNextMarkObject.getX(), estTimeToNextMarkObject.getY());
|
||||||
|
|
||||||
legTimeObject.setX(LEGTIME_X_OFFSET);
|
legTimeObject.setX(LEGTIME_X_OFFSET);
|
||||||
legTimeObject.setY(LEGTIME_Y_OFFSET);
|
legTimeObject.setY(LEGTIME_Y_OFFSET);
|
||||||
legTimeObject.relocate(legTimeObject.getX(), legTimeObject.getY());
|
legTimeObject.relocate(legTimeObject.getX(), legTimeObject.getY());
|
||||||
|
|
||||||
wake = new Wake(0, -BOAT_HEIGHT);
|
wake = new Wake(0, -BOAT_HEIGHT);
|
||||||
super.getChildren().addAll(teamNameObject, velocityObject, boatPoly, estTimeToNextMarkObject, legTimeObject);
|
super.getChildren()
|
||||||
|
.addAll(teamNameObject, velocityObject, boatPoly, estTimeToNextMarkObject,
|
||||||
|
legTimeObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates the javafx objects that will be the in the group by default.
|
* Creates the javafx objects that will be the in the group by default.
|
||||||
|
*
|
||||||
* @param color The colour of the boat polygon and the trailing line.
|
* @param color The colour of the boat polygon and the trailing line.
|
||||||
*/
|
*/
|
||||||
private void initChildren(Color color) {
|
private void initChildren(Color color) {
|
||||||
@@ -131,7 +147,9 @@ public class BoatGroup extends RaceObject{
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Moves the boat and its children annotations from its current coordinates by specified amounts.
|
* Moves the boat and its children annotations from its current coordinates by specified
|
||||||
|
* amounts.
|
||||||
|
*
|
||||||
* @param dx The amount to move the X coordinate by
|
* @param dx The amount to move the X coordinate by
|
||||||
* @param dy The amount to move the Y coordinate by
|
* @param dy The amount to move the Y coordinate by
|
||||||
*/
|
*/
|
||||||
@@ -153,6 +171,7 @@ public class BoatGroup extends RaceObject{
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Moves the boat and its children annotations to coordinates specified
|
* Moves the boat and its children annotations to coordinates specified
|
||||||
|
*
|
||||||
* @param x The X coordinate to move the boat to
|
* @param x The X coordinate to move the boat to
|
||||||
* @param y The Y coordinate to move the boat to
|
* @param y The Y coordinate to move the boat to
|
||||||
* @param rotation The heading in degrees from north the boat should rotate to.
|
* @param rotation The heading in degrees from north the boat should rotate to.
|
||||||
@@ -164,6 +183,7 @@ public class BoatGroup extends RaceObject{
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Moves the boat and its children annotations to coordinates specified
|
* Moves the boat and its children annotations to coordinates specified
|
||||||
|
*
|
||||||
* @param x The X coordinate to move the boat to
|
* @param x The X coordinate to move the boat to
|
||||||
* @param y The Y coordinate to move the boat to
|
* @param y The Y coordinate to move the boat to
|
||||||
*/
|
*/
|
||||||
@@ -185,7 +205,9 @@ public class BoatGroup extends RaceObject{
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Updates the position of all graphics in the BoatGroup based off of the given time interval.
|
* Updates the position of all graphics in the BoatGroup based off of the given time interval.
|
||||||
* @param timeInterval The interval, in milliseconds, the boat should update it's position based on.
|
*
|
||||||
|
* @param timeInterval The interval, in milliseconds, the boat should update it's position based
|
||||||
|
* on.
|
||||||
*/
|
*/
|
||||||
public void updatePosition(long timeInterval) {
|
public void updatePosition(long timeInterval) {
|
||||||
//Calculate the movement of the boat.
|
//Calculate the movement of the boat.
|
||||||
@@ -219,18 +241,21 @@ public class BoatGroup extends RaceObject{
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the destination of the boat and the headng it should have once it reaches
|
* Sets the destination of the boat and the headng it should have once it reaches
|
||||||
|
*
|
||||||
* @param newXValue The X co-ordinate the boat needs to move to.
|
* @param newXValue The X co-ordinate the boat needs to move to.
|
||||||
* @param newYValue The Y co-ordinate the boat needs to move to.
|
* @param newYValue The Y co-ordinate the boat needs to move to.
|
||||||
* @param rotation Rotation to move graphics to.
|
* @param rotation Rotation to move graphics to.
|
||||||
* @param raceIds RaceID of the object to move.
|
* @param raceIds RaceID of the object to move.
|
||||||
*/
|
*/
|
||||||
public void setDestination (double newXValue, double newYValue, double rotation, double groundSpeed, int... raceIds) {
|
public void setDestination(double newXValue, double newYValue, double rotation,
|
||||||
|
double groundSpeed, int... raceIds) {
|
||||||
if (hasRaceId(raceIds)) {
|
if (hasRaceId(raceIds)) {
|
||||||
if (setToInitialLocation) {
|
if (setToInitialLocation) {
|
||||||
destinationSet = true;
|
destinationSet = true;
|
||||||
boat.setVelocity(groundSpeed);
|
boat.setVelocity(groundSpeed);
|
||||||
if (currentRotation < 0)
|
if (currentRotation < 0) {
|
||||||
currentRotation = 360 - currentRotation;
|
currentRotation = 360 - currentRotation;
|
||||||
|
}
|
||||||
double dx = newXValue - boatPoly.getLayoutX();
|
double dx = newXValue - boatPoly.getLayoutX();
|
||||||
double dy = newYValue - boatPoly.getLayoutY();
|
double dy = newYValue - boatPoly.getLayoutY();
|
||||||
//Check movement is reasonable. Assumes a 1000 * 1000 canvas
|
//Check movement is reasonable. Assumes a 1000 * 1000 canvas
|
||||||
@@ -251,14 +276,23 @@ public class BoatGroup extends RaceObject{
|
|||||||
rotationalVelocity = 0;
|
rotationalVelocity = 0;
|
||||||
wakeGenerationDelay--;
|
wakeGenerationDelay--;
|
||||||
} else {
|
} else {
|
||||||
wake.setRotationalVelocity(rotationalVelocity, rotationalGoal, boat.getVelocity());
|
wake.setRotationalVelocity(rotationalVelocity, rotationalGoal,
|
||||||
|
boat.getVelocity());
|
||||||
}
|
}
|
||||||
velocityObject.setText(String.format("%.2f m/s", boat.getVelocity()));
|
velocityObject.setText(String.format("%.2f m/s", boat.getVelocity()));
|
||||||
estTimeToNextMarkObject.setText(String.valueOf(boat.getEstimateTimeAtNextMark()));
|
|
||||||
legTimeObject.setText(String.valueOf(boat.getMarkRoundingTime()));
|
|
||||||
DateFormat format = new SimpleDateFormat("mm:ss");
|
DateFormat format = new SimpleDateFormat("mm:ss");
|
||||||
String timeToNextMark = format.format(boat.getEstimateTimeAtNextMark() - StreamParser.getCurrentTimeLong());
|
// estimate time to next mark
|
||||||
|
String timeToNextMark = format
|
||||||
|
.format(boat.getEstimateTimeAtNextMark() - StreamParser.getCurrentTimeLong());
|
||||||
estTimeToNextMarkObject.setText("Next mark: " + timeToNextMark);
|
estTimeToNextMarkObject.setText("Next mark: " + timeToNextMark);
|
||||||
|
// elapsed time
|
||||||
|
if (boat.getMarkRoundingTime() != null) {
|
||||||
|
String elapsedTime = format
|
||||||
|
.format(StreamParser.getCurrentTimeLong() - boat.getMarkRoundingTime());
|
||||||
|
legTimeObject.setText("Last mark: " + elapsedTime);
|
||||||
|
} else {
|
||||||
|
legTimeObject.setText("Last mark: -");
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
setToInitialLocation = true;
|
setToInitialLocation = true;
|
||||||
rotationalGoal = rotation;
|
rotationalGoal = rotation;
|
||||||
@@ -289,7 +323,8 @@ public class BoatGroup extends RaceObject{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setDestination (double newXValue, double newYValue, double groundSpeed, int... raceIDs) {
|
public void setDestination(double newXValue, double newYValue, double groundSpeed,
|
||||||
|
int... raceIDs) {
|
||||||
destinationSet = true;
|
destinationSet = true;
|
||||||
|
|
||||||
if (hasRaceId(raceIDs)) {
|
if (hasRaceId(raceIDs)) {
|
||||||
@@ -326,7 +361,7 @@ public class BoatGroup extends RaceObject{
|
|||||||
estTimeToNextMarkObject.setVisible(visible);
|
estTimeToNextMarkObject.setVisible(visible);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setLegObjectTime(Boolean visible) {
|
public void setLegTimeObjectVisible(Boolean visible) {
|
||||||
legTimeObject.setVisible(visible);
|
legTimeObject.setVisible(visible);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -350,9 +385,10 @@ public class BoatGroup extends RaceObject{
|
|||||||
*/
|
*/
|
||||||
public boolean hasRaceId(int... raceIds) {
|
public boolean hasRaceId(int... raceIds) {
|
||||||
for (int id : raceIds) {
|
for (int id : raceIds) {
|
||||||
if (id == boat.getSourceID())
|
if (id == boat.getSourceID()) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -366,9 +402,9 @@ public class BoatGroup extends RaceObject{
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Due to javaFX limitations annotations associated with a boat that you want to appear below all boats in the
|
* Due to javaFX limitations annotations associated with a boat that you want to appear below
|
||||||
* Z-axis need to be pulled out of the BoatGroup and added to the parent group of the BoatGroups. This function
|
* all boats in the Z-axis need to be pulled out of the BoatGroup and added to the parent group
|
||||||
* returns these annotations as a group.
|
* of the BoatGroups. This function returns these annotations as a group.
|
||||||
*
|
*
|
||||||
* @return A group containing low priority annotations.
|
* @return A group containing low priority annotations.
|
||||||
*/
|
*/
|
||||||
@@ -379,9 +415,10 @@ public class BoatGroup extends RaceObject{
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Use this function to let the BoatGroup know about the stage it is in. If it knows about it's stage then it will
|
* Use this function to let the BoatGroup know about the stage it is in. If it knows about it's
|
||||||
* listen to the iconified property of that stage and change it's behaviour upon minimization. Without setting the
|
* stage then it will listen to the iconified property of that stage and change it's behaviour
|
||||||
* Stage there is guarantee that the BoatGroup will draw properly when the stage is minimized.
|
* upon minimization. Without setting the Stage there is guarantee that the BoatGroup will draw
|
||||||
|
* properly when the stage is minimized.
|
||||||
*
|
*
|
||||||
* @param stage The stage that the BoatGroup is added to.
|
* @param stage The stage that the BoatGroup is added to.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
<?import java.lang.*?>
|
<?import java.lang.*?>
|
||||||
<?import javafx.scene.layout.*?>
|
<?import javafx.scene.layout.*?>
|
||||||
|
|
||||||
<AnchorPane fx:id="annotationSelectWindow" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="248.0" prefWidth="469.0" styleClass="background-blue" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1">
|
<AnchorPane fx:id="annotationSelectWindow" maxHeight="270.0" maxWidth="469.0" minHeight="270.0" minWidth="469.0" prefHeight="270.0" prefWidth="469.0" styleClass="background-blue" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1">
|
||||||
<children>
|
<children>
|
||||||
<Text fill="WHITE" layoutX="26.0" layoutY="52.0" strokeType="OUTSIDE" strokeWidth="0.0" text="Select important annotations">
|
<Text fill="WHITE" layoutX="26.0" layoutY="52.0" strokeType="OUTSIDE" strokeWidth="0.0" text="Select important annotations">
|
||||||
<font>
|
<font>
|
||||||
@@ -26,5 +26,6 @@
|
|||||||
<String fx:value="clearExitButton" />
|
<String fx:value="clearExitButton" />
|
||||||
</styleClass>
|
</styleClass>
|
||||||
</Button>
|
</Button>
|
||||||
|
<CheckBox fx:id="boatElapsedTimeSelect" layoutX="26.0" layoutY="235.0" mnemonicParsing="false" text="Boat Elapsed Time Since Last Mark" textFill="#e7e7e7" />
|
||||||
</children>
|
</children>
|
||||||
</AnchorPane>
|
</AnchorPane>
|
||||||
|
|||||||
Reference in New Issue
Block a user