From 126d8ea8706ab4ecca12eb92f20efb3b629dc890 Mon Sep 17 00:00:00 2001 From: Calum Date: Wed, 9 Aug 2017 15:24:32 +1200 Subject: [PATCH 01/33] Added factory class for producing mark arrows. #story[1118] --- .../fxObjects/MarkArrowFactory.java | 56 +++++++++++++++++++ .../seng302/visualiser/fxObjects/Marker.java | 20 ++++++- 2 files changed, 73 insertions(+), 3 deletions(-) create mode 100644 src/main/java/seng302/visualiser/fxObjects/MarkArrowFactory.java diff --git a/src/main/java/seng302/visualiser/fxObjects/MarkArrowFactory.java b/src/main/java/seng302/visualiser/fxObjects/MarkArrowFactory.java new file mode 100644 index 00000000..9ab67b2b --- /dev/null +++ b/src/main/java/seng302/visualiser/fxObjects/MarkArrowFactory.java @@ -0,0 +1,56 @@ +package seng302.visualiser.fxObjects; + +import javafx.scene.Group; +import javafx.scene.paint.Paint; +import javafx.scene.shape.Line; +import javafx.scene.shape.Polyline; + +/** + * Created by cir27 on 9/08/17. + */ +public class MarkArrowFactory { + + public enum RoundingType { + PORT, + STARBOARD, + } + + public static Group constructEntryArrow (RoundingType roundingSide, double angleOfEntry, + double angleOfExit, Paint colour) { + Group arrow = new Group(); + return arrow; + } + + public static Group constructExitArrow (RoundingType roundingSide, double angleOfEntry, Paint colour) { + Group arrow = new Group(); + Line arrowBody; + Polyline arrowHead = constructArrowHead(); + if (roundingSide == RoundingType.PORT) { + arrowBody = new Line( + -10, -10, + -10, -30 + ); + arrowHead.setLayoutX(-10); + arrowHead.setLayoutY(-10); + } else { + arrowBody = new Line( + 10, -10, + 10, -30 + ); + arrowHead.setLayoutX(10); + arrowHead.setLayoutY(-10); + } + arrowBody.setFill(colour); + arrowHead.setFill(colour); + arrow.getChildren().addAll(arrowBody, arrowHead); + return arrow; + } + + private static Polyline constructArrowHead () { + return new Polyline( + -5, -5, + 0, 0, + 5, -5 + ); + } +} diff --git a/src/main/java/seng302/visualiser/fxObjects/Marker.java b/src/main/java/seng302/visualiser/fxObjects/Marker.java index 5697f5ef..22942a2b 100644 --- a/src/main/java/seng302/visualiser/fxObjects/Marker.java +++ b/src/main/java/seng302/visualiser/fxObjects/Marker.java @@ -1,19 +1,33 @@ package seng302.visualiser.fxObjects; +import javafx.application.Platform; +import javafx.scene.Group; import javafx.scene.paint.Paint; import javafx.scene.shape.Circle; /** * Visual object for a mark. */ -public class Marker extends Circle { +public class Marker extends Group { + + Circle mark = new Circle(); + Group enterArrow; + Group exitArrow; public Marker() { - super.setRadius(5); + mark.setRadius(5); } public Marker(Paint colour) { this(); - super.setFill(colour); + mark.setFill(colour); + } + + public void showEnterArrow () { + Platform.runLater(() -> this.getChildren().setAll(enterArrow)); + } + + public void showExitArrow () { + Platform.runLater(() -> this.getChildren().setAll(exitArrow)); } } \ No newline at end of file From 2c5fddb695205b6ba4283d6d41edce40ea8732e8 Mon Sep 17 00:00:00 2001 From: Calum Date: Wed, 9 Aug 2017 16:56:46 +1200 Subject: [PATCH 02/33] Implemented zooming and clipping of race border. Implementation is still hackish. #pair[ptg19, cir27] #story[1121] --- .../java/seng302/visualiser/GameView.java | 59 +------------- .../controllers/RaceViewController.java | 10 +-- .../visualiser/fxObjects/AnnotationBox.java | 4 +- .../visualiser/fxObjects/BoatObject.java | 3 +- src/main/resources/views/RaceView.fxml | 80 +++++++++---------- 5 files changed, 50 insertions(+), 106 deletions(-) diff --git a/src/main/java/seng302/visualiser/GameView.java b/src/main/java/seng302/visualiser/GameView.java index 95e1aed0..1f0a6ceb 100644 --- a/src/main/java/seng302/visualiser/GameView.java +++ b/src/main/java/seng302/visualiser/GameView.java @@ -9,14 +9,10 @@ import java.util.Map; import javafx.animation.AnimationTimer; import javafx.application.Platform; import javafx.collections.ObservableList; -import javafx.event.EventHandler; import javafx.geometry.Point2D; import javafx.scene.Group; import javafx.scene.Node; import javafx.scene.image.ImageView; -import javafx.scene.input.KeyCode; -import javafx.scene.input.KeyEvent; -import javafx.scene.input.ScrollEvent; import javafx.scene.layout.AnchorPane; import javafx.scene.layout.Pane; import javafx.scene.paint.Color; @@ -93,18 +89,14 @@ public class GameView extends Pane { public void zoomOut() { scaleFactor = 0.95; - for (Node child : getChildren()) { - child.setScaleX(child.getScaleX() * scaleFactor); - child.setScaleY(child.getScaleY() * scaleFactor); - } + this.setScaleX(this.getScaleX() * scaleFactor); + this.setScaleY(this.getScaleY() * scaleFactor); } public void zoomIn() { scaleFactor = 1.05; - for (Node child : getChildren()) { - child.setScaleX(child.getScaleX() * scaleFactor); - child.setScaleY(child.getScaleY() * scaleFactor); - } + this.setScaleX(this.getScaleX() * scaleFactor); + this.setScaleY(this.getScaleY() * scaleFactor); } private enum ScaleDirection { @@ -122,45 +114,6 @@ public class GameView extends Pane { gameObjects.add(fpsDisplay); gameObjects.add(raceBorder); gameObjects.add(markers); -// -// this.setOnKeyPressed(new EventHandler() { -// @Override public void handle(KeyEvent event) { -// event.consume(); -// switch (event.getCode()) { -// case Z: -// scaleFactor = scaleFactor * 1.2; -// break; -// case X: -// scaleFactor = scaleFactor * 0.8; -// break; -// } -// if (event.getCode() == KeyCode.Z || event.getCode() == KeyCode.X) { -// for (Node child : getChildren()) { -// child.setScaleX(child.getScaleX() * scaleFactor); -// child.setScaleY(child.getScaleY() * scaleFactor); -// } -// } -// } -// }); -// -// this.setOnScroll(new EventHandler() { -// @Override public void handle(ScrollEvent event) { -// event.consume(); -// if (event.getDeltaY() == 0) { -// return; -// } -// -// double scaleFactor = -// (event.getDeltaY() > 0) -// ? SCALE_DELTA -// : 1/SCALE_DELTA; -// for (Node child : getChildren()) { -// child.setScaleX(child.getScaleX() * scaleFactor); -// child.setScaleY(child.getScaleY() * scaleFactor); -// } -// } -// }); - initializeTimer(); } @@ -393,9 +346,6 @@ public class GameView extends Pane { BoatObject bo = boatObjects.get(boat); Point2D p2d = findScaledXY(lat, lon); bo.moveTo(p2d.getX(), p2d.getY(), heading, velocity, sailIn, windDir); -// annotations.get(boat).setLayoutX(p2d.getX()); -// annotations.get(boat).setLayoutY(p2d.getY()); -// annotations.get(boat).setLocation(100d, 100d); annotations.get(boat).setLocation(p2d.getX(), p2d.getY()); bo.setTrajectory( heading, @@ -410,7 +360,6 @@ public class GameView extends Pane { gameObjects.addAll(wakes); gameObjects.addAll(annotationsGroup); gameObjects.addAll(boatObjectGroup); - }); } diff --git a/src/main/java/seng302/visualiser/controllers/RaceViewController.java b/src/main/java/seng302/visualiser/controllers/RaceViewController.java index 63ce668a..4130f536 100644 --- a/src/main/java/seng302/visualiser/controllers/RaceViewController.java +++ b/src/main/java/seng302/visualiser/controllers/RaceViewController.java @@ -115,11 +115,11 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel initialiseSparkLine(); gameView = new GameView(); - Platform.runLater(() -> contentAnchorPane.getChildren().add(gameView)); - gameView.setBoats(new ArrayList<>(participants.values())); - gameView.updateBorder(raceData.getCourseLimit()); - gameView.updateCourse( - new ArrayList<>(raceData.getCompoundMarks().values()), raceData.getMarkSequence() + Platform.runLater(() -> contentAnchorPane.getChildren().add(0, gameView)); + gameView.setBoats(new ArrayList<>(participants.values())); + gameView.updateBorder(raceData.getCourseLimit()); + gameView.updateCourse( + new ArrayList<>(raceData.getCompoundMarks().values()), raceData.getMarkSequence() ); gameView.setBoatAsPlayer(player); gameView.startRace(); diff --git a/src/main/java/seng302/visualiser/fxObjects/AnnotationBox.java b/src/main/java/seng302/visualiser/fxObjects/AnnotationBox.java index cdaf329e..69c9e836 100644 --- a/src/main/java/seng302/visualiser/fxObjects/AnnotationBox.java +++ b/src/main/java/seng302/visualiser/fxObjects/AnnotationBox.java @@ -95,7 +95,7 @@ public class AnnotationBox extends Group { background.setStroke(theme); background.setStrokeWidth(2); background.setCache(true); - background.setCacheHint(CacheHint.SPEED); + background.setCacheHint(CacheHint.SCALE); this.getChildren().add(background); } @@ -213,7 +213,7 @@ public class AnnotationBox extends Group { Text text = new Text(); text.setFill(theme); text.setStrokeWidth(2); - text.setCacheHint(CacheHint.SPEED); +// text.setCacheHint(CacheHint.QUALITY); text.setCache(true); return text; } diff --git a/src/main/java/seng302/visualiser/fxObjects/BoatObject.java b/src/main/java/seng302/visualiser/fxObjects/BoatObject.java index 76180bf8..bb2c2775 100644 --- a/src/main/java/seng302/visualiser/fxObjects/BoatObject.java +++ b/src/main/java/seng302/visualiser/fxObjects/BoatObject.java @@ -3,7 +3,6 @@ package seng302.visualiser.fxObjects; import java.util.ArrayList; import javafx.application.Platform; import javafx.geometry.Point2D; -import javafx.scene.CacheHint; import javafx.scene.Group; import javafx.scene.Node; import javafx.scene.paint.Color; @@ -85,7 +84,7 @@ public class BoatObject extends Group { }); boatPoly.setOnMouseClicked(event -> setIsSelected(!isSelected)); boatPoly.setCache(true); - boatPoly.setCacheHint(CacheHint.SPEED); +// boatPoly.setCacheHint(CacheHint.SPEED); // annotationBox = new AnnotationBox(); // annotationBox.setFill(colour); diff --git a/src/main/resources/views/RaceView.fxml b/src/main/resources/views/RaceView.fxml index e13853d1..0d004b90 100644 --- a/src/main/resources/views/RaceView.fxml +++ b/src/main/resources/views/RaceView.fxml @@ -1,5 +1,11 @@ + + + + + + @@ -17,40 +23,33 @@ - - - - - - - - - - - - - - + + + + From 8ec649062727bd7882183f14f31fa1caf4c7b9e0 Mon Sep 17 00:00:00 2001 From: Kusal Ekanayake Date: Sun, 13 Aug 2017 17:02:35 +1200 Subject: [PATCH 03/33] Started trying to get the zoomed in gave view to follow the boat. Can easily make the boat stay put at the origin. can make it perfectly center, also weary of the weird jittery effect that is present when tracking. Tracking is active when the zoom scale is greater than 1. #story[1121] --- .../java/seng302/visualiser/GameClient.java | 3 +- .../java/seng302/visualiser/GameView.java | 31 +++++++++++++++---- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/src/main/java/seng302/visualiser/GameClient.java b/src/main/java/seng302/visualiser/GameClient.java index cf4590ca..6246eef3 100644 --- a/src/main/java/seng302/visualiser/GameClient.java +++ b/src/main/java/seng302/visualiser/GameClient.java @@ -215,6 +215,7 @@ public class GameClient { * Updates the position of a boat. Boat and position are given in the provided data. */ private void updatePosition(PositionUpdateData positionData) { + raceView.getGameView().trackBoat(); if (positionData.getType() == DeviceType.YACHT_TYPE) { if (allXMLReceived() && allBoatsMap.containsKey(positionData.getDeviceId())) { Yacht yacht = allBoatsMap.get(positionData.getDeviceId()); @@ -306,11 +307,9 @@ public class GameClient { //TODO Allow a zoom in and zoom out methods case Z: // zoom in raceView.getGameView().zoomIn(); - System.out.println("Zoom in"); break; case X: // zoom out raceView.getGameView().zoomOut(); - System.out.println("Zoom out"); break; } } diff --git a/src/main/java/seng302/visualiser/GameView.java b/src/main/java/seng302/visualiser/GameView.java index 1f0a6ceb..f984186a 100644 --- a/src/main/java/seng302/visualiser/GameView.java +++ b/src/main/java/seng302/visualiser/GameView.java @@ -88,15 +88,15 @@ public class GameView extends Pane { double scaleFactor = 1; public void zoomOut() { - scaleFactor = 0.95; - this.setScaleX(this.getScaleX() * scaleFactor); - this.setScaleY(this.getScaleY() * scaleFactor); + scaleFactor = 0.05; + this.setScaleX(this.getScaleX() - scaleFactor); + this.setScaleY(this.getScaleY() - scaleFactor); } public void zoomIn() { - scaleFactor = 1.05; - this.setScaleX(this.getScaleX() * scaleFactor); - this.setScaleY(this.getScaleY() * scaleFactor); + scaleFactor = 0.05; + this.setScaleX(this.getScaleX() + scaleFactor); + this.setScaleY(this.getScaleY() + scaleFactor); } private enum ScaleDirection { @@ -104,6 +104,25 @@ public class GameView extends Pane { VERTICAL } + public void trackBoat() { + if (this.getScaleX() > 1) { + double x = boatObjects.get(playerYacht).getBoatLayoutX(); + double y = boatObjects.get(playerYacht).getBoatLayoutY(); +// System.out.println("x = " + x); +// System.out.println("y = " + y); +// this.setRotate(-playerYacht.getHeading()); + Point2D displacementX = findScaledXY(maxLonPoint); + Point2D displacementY = findScaledXY(maxLatPoint); + this.setLayoutX(-x + 250 + canvasWidth/2); + this.setLayoutY(-y + canvasHeight/2); + } else { + this.setLayoutX(0); + this.setLayoutY(0); + } + System.out.println("boatObjects = " + boatObjects.get(playerYacht).getBoatLayoutX()); + System.out.println("boatObjects = " + boatObjects.get(playerYacht).getBoatLayoutY()); + } + public GameView () { gameObjects = this.getChildren(); // create image view for map, bind panel size to image From 0b978593d49b5806488ec274c459895232aa7ef8 Mon Sep 17 00:00:00 2001 From: Zhi You Tan Date: Sun, 13 Aug 2017 18:52:42 +1200 Subject: [PATCH 04/33] Solved the fps counter zoom together with canvas problem. Workaround used was changing fps counter on game view to race view. #story[1117] #pair[ptg19, zyt10] --- .../java/seng302/visualiser/GameClient.java | 1 - .../java/seng302/visualiser/GameView.java | 13 +++++---- .../controllers/RaceViewController.java | 3 ++ src/main/resources/views/RaceView.fxml | 29 ++++++++++++++++++- 4 files changed, 38 insertions(+), 8 deletions(-) diff --git a/src/main/java/seng302/visualiser/GameClient.java b/src/main/java/seng302/visualiser/GameClient.java index 6246eef3..67a18a4b 100644 --- a/src/main/java/seng302/visualiser/GameClient.java +++ b/src/main/java/seng302/visualiser/GameClient.java @@ -174,7 +174,6 @@ public class GameClient { break; case BOAT_XML: - System.out.println("GOT SUM BOATS YAY :)"); allBoatsMap = XMLParser.parseBoats( StreamParser.extractXmlMessage(packet) ); diff --git a/src/main/java/seng302/visualiser/GameView.java b/src/main/java/seng302/visualiser/GameView.java index f984186a..920939c2 100644 --- a/src/main/java/seng302/visualiser/GameView.java +++ b/src/main/java/seng302/visualiser/GameView.java @@ -119,18 +119,14 @@ public class GameView extends Pane { this.setLayoutX(0); this.setLayoutY(0); } - System.out.println("boatObjects = " + boatObjects.get(playerYacht).getBoatLayoutX()); - System.out.println("boatObjects = " + boatObjects.get(playerYacht).getBoatLayoutY()); +// System.out.println("boatObjects = " + boatObjects.get(playerYacht).getBoatLayoutX()); +// System.out.println("boatObjects = " + boatObjects.get(playerYacht).getBoatLayoutY()); } public GameView () { gameObjects = this.getChildren(); // create image view for map, bind panel size to image gameObjects.add(mapImage); - fpsDisplay.setLayoutX(5); - fpsDisplay.setLayoutY(20); - fpsDisplay.setStrokeWidth(2); - gameObjects.add(fpsDisplay); gameObjects.add(raceBorder); gameObjects.add(markers); initializeTimer(); @@ -631,4 +627,9 @@ public class GameView extends Pane { }); } + + public void setFrameRateFXText(Text fpsDisplay) { + this.fpsDisplay = null; + this.fpsDisplay = fpsDisplay; + } } diff --git a/src/main/java/seng302/visualiser/controllers/RaceViewController.java b/src/main/java/seng302/visualiser/controllers/RaceViewController.java index 4130f536..1a3f572c 100644 --- a/src/main/java/seng302/visualiser/controllers/RaceViewController.java +++ b/src/main/java/seng302/visualiser/controllers/RaceViewController.java @@ -71,6 +71,8 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel private Button selectAnnotationBtn; @FXML private ComboBox yachtSelectionComboBox; + @FXML + private Text fpsDisplay; //Race Data private Map participants; @@ -115,6 +117,7 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel initialiseSparkLine(); gameView = new GameView(); + gameView.setFrameRateFXText(fpsDisplay); Platform.runLater(() -> contentAnchorPane.getChildren().add(0, gameView)); gameView.setBoats(new ArrayList<>(participants.values())); gameView.updateBorder(raceData.getCourseLimit()); diff --git a/src/main/resources/views/RaceView.fxml b/src/main/resources/views/RaceView.fxml index 0d004b90..d00f0099 100644 --- a/src/main/resources/views/RaceView.fxml +++ b/src/main/resources/views/RaceView.fxml @@ -26,7 +26,34 @@ - + + + + + + + + + + + + + + + + + +