diff --git a/src/main/java/seng302/visualiser/GameView.java b/src/main/java/seng302/visualiser/GameView.java index db8a7686..37d579b7 100644 --- a/src/main/java/seng302/visualiser/GameView.java +++ b/src/main/java/seng302/visualiser/GameView.java @@ -1,13 +1,18 @@ package seng302.visualiser; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import javafx.scene.Group; import javafx.scene.Node; +import seng302.model.ClientYacht; import seng302.model.Limit; import seng302.model.ScaledPoint; import seng302.model.mark.CompoundMark; import seng302.model.mark.Corner; +import seng302.model.mark.Mark; +import seng302.utilities.Sounds; +import seng302.visualiser.fxObjects.Marker; /** * Abstract class for keeping functionality common between race visualisation. @@ -24,8 +29,36 @@ public abstract class GameView { List course = new ArrayList<>(); List compoundMarks = new ArrayList<>(); List courseOrder = new ArrayList<>(); + HashMap markerObjects = new HashMap<>(); public abstract Node getAssets(); public abstract void updateCourse(List newCourse, List sequence); public abstract void updateBorder(List border); + + void updateMarkArrows (ClientYacht yacht, int legNumber) { + CompoundMark compoundMark; + if (legNumber - 1 >= 0 && legNumber-1 < course.size()) { + Sounds.playMarkRoundingSound(); + compoundMark = course.get(legNumber-1); + for (Mark mark : compoundMark.getMarks()) { + markerObjects.get(mark).showNextExitArrow(); + } + } + CompoundMark nextMark = null; + if (legNumber < course.size()) { + Sounds.playMarkRoundingSound(); + nextMark = course.get(legNumber); + for (Mark mark : nextMark.getMarks()) { + markerObjects.get(mark).showNextEnterArrow(); + } + } + if (legNumber - 2 >= 0) { + CompoundMark lastMark = course.get(Math.max(0, legNumber - 2)); + if (lastMark != nextMark) { + for (Mark mark : lastMark.getMarks()) { + markerObjects.get(mark).hideAllArrows(); + } + } + } + } } diff --git a/src/main/java/seng302/visualiser/GameView3D.java b/src/main/java/seng302/visualiser/GameView3D.java index 29c12074..6851d2be 100644 --- a/src/main/java/seng302/visualiser/GameView3D.java +++ b/src/main/java/seng302/visualiser/GameView3D.java @@ -34,7 +34,6 @@ import seng302.model.mark.Corner; import seng302.model.mark.Mark; import seng302.model.token.Token; import seng302.utilities.GeoUtility; -import seng302.utilities.Sounds; import seng302.visualiser.cameras.ChaseCamera; import seng302.visualiser.cameras.IsometricCamera; import seng302.visualiser.cameras.RaceCamera; @@ -55,7 +54,7 @@ public class GameView3D extends GameView { private final double FOV = 60; private final double DEFAULT_CAMERA_X = 0; - private final double DEFAULT_CAMERA_Y = 100; + private final double DEFAULT_CAMERA_Y = 160; private Group root3D; private SubScene view; @@ -66,11 +65,6 @@ public class GameView3D extends GameView { private PerspectiveCamera isometricCam; private PerspectiveCamera topDownCam; private PerspectiveCamera chaseCam; - - /* Note that if either of these is null then values for it have not been added and the other - should be used as the limits of the map. */ - private Map markerObjects; - private BoatObject playerBoat; private Map boatObjects = new HashMap<>(); private Group wakesGroup = new Group(); @@ -535,31 +529,4 @@ public class GameView3D extends GameView { public void setWindDir(double windDir) { this.windDir = windDir; } - - private void updateMarkArrows (ClientYacht yacht, int legNumber) { - CompoundMark compoundMark; - if (legNumber - 1 >= 0) { - Sounds.playMarkRoundingSound(); - compoundMark = course.get(legNumber-1); - for (Mark mark : compoundMark.getMarks()) { - markerObjects.get(mark).showNextExitArrow(); - } - } - CompoundMark nextMark = null; - if (legNumber < course.size() - 1) { - Sounds.playMarkRoundingSound(); - nextMark = course.get(legNumber); - for (Mark mark : nextMark.getMarks()) { - markerObjects.get(mark).showNextEnterArrow(); - } - } - if (legNumber - 2 >= 0) { - CompoundMark lastMark = course.get(Math.max(0, legNumber - 2)); - if (lastMark != nextMark) { - for (Mark mark : lastMark.getMarks()) { - markerObjects.get(mark).hideAllArrows(); - } - } - } - } } \ No newline at end of file diff --git a/src/main/java/seng302/visualiser/MapPreview.java b/src/main/java/seng302/visualiser/MapPreview.java index 4c2c3a38..9725e526 100644 --- a/src/main/java/seng302/visualiser/MapPreview.java +++ b/src/main/java/seng302/visualiser/MapPreview.java @@ -3,7 +3,6 @@ package seng302.visualiser; import java.util.ArrayList; import java.util.HashMap; import java.util.List; -import java.util.Map; import javafx.application.Platform; import javafx.geometry.Point2D; import javafx.scene.Node; @@ -19,6 +18,7 @@ import seng302.model.mark.Corner; import seng302.model.mark.Mark; import seng302.utilities.GeoUtility; import seng302.visualiser.fxObjects.MarkArrowFactory; +import seng302.visualiser.fxObjects.Marker; import seng302.visualiser.fxObjects.assets_2D.CourseBoundary; import seng302.visualiser.fxObjects.assets_2D.Gate; import seng302.visualiser.fxObjects.assets_2D.Marker2D; @@ -29,7 +29,6 @@ import seng302.visualiser.fxObjects.assets_2D.Marker2D; public class MapPreview extends GameView { private Polygon raceBorder = new CourseBoundary(); - protected Map markerObjects; public MapPreview(List marks, List course, List border) { this.compoundMarks = marks; @@ -240,7 +239,7 @@ public class MapPreview extends GameView { * @param colour The desired colour of the gate. * @return the new gate. */ - private Gate makeAndBindGate(Marker2D m1, Marker2D m2, Paint colour) { + private Gate makeAndBindGate(Marker m1, Marker m2, Paint colour) { Gate gate = new Gate(colour); gate.startXProperty().bind( m1.layoutXProperty() diff --git a/src/main/java/seng302/visualiser/MiniMap.java b/src/main/java/seng302/visualiser/MiniMap.java index 8c9377dd..092f6c17 100644 --- a/src/main/java/seng302/visualiser/MiniMap.java +++ b/src/main/java/seng302/visualiser/MiniMap.java @@ -11,8 +11,6 @@ import seng302.model.ClientYacht; import seng302.model.Limit; import seng302.model.mark.CompoundMark; import seng302.model.mark.Corner; -import seng302.model.mark.Mark; -import seng302.utilities.Sounds; /** * Class converts a map preview to a minimap by adding boats. @@ -20,15 +18,9 @@ import seng302.utilities.Sounds; public class MiniMap extends MapPreview { private HashMap boatIcons = new HashMap<>(); - private Polygon playerBoat; - private double playerRotation; - private List boats; - private ClientYacht player; public MiniMap (List marks, List course, List border, List boats, ClientYacht player) { super(marks, course, border); - this.boats = boats; - this.player = player; setBoats(boats); player.addMarkRoundingListener(this::updateMarkArrows); } @@ -56,31 +48,4 @@ public class MiniMap extends MapPreview { gameObjects.getChildren().addAll(boatIcons.values()); }); } - - private void updateMarkArrows (ClientYacht yacht, int legNumber) { - CompoundMark compoundMark; - if (legNumber - 1 >= 0) { - Sounds.playMarkRoundingSound(); - compoundMark = course.get(legNumber-1); - for (Mark mark : compoundMark.getMarks()) { - markerObjects.get(mark).showNextExitArrow(); - } - } - CompoundMark nextMark = null; - if (legNumber < course.size() - 1) { - Sounds.playMarkRoundingSound(); - nextMark = course.get(legNumber); - for (Mark mark : nextMark.getMarks()) { - markerObjects.get(mark).showNextEnterArrow(); - } - } - if (legNumber - 2 >= 0) { - CompoundMark lastMark = course.get(Math.max(0, legNumber - 2)); - if (lastMark != nextMark) { - for (Mark mark : lastMark.getMarks()) { - markerObjects.get(mark).hideAllArrows(); - } - } - } - } } diff --git a/src/main/java/seng302/visualiser/cameras/IsometricCamera.java b/src/main/java/seng302/visualiser/cameras/IsometricCamera.java index 85a0e502..2ba1bc8d 100644 --- a/src/main/java/seng302/visualiser/cameras/IsometricCamera.java +++ b/src/main/java/seng302/visualiser/cameras/IsometricCamera.java @@ -16,8 +16,8 @@ public class IsometricCamera extends PerspectiveCamera implements RaceCamera { private final Double MAX_Y = 170.0; private final Double PAN_LIMIT = 160.0; - private final Double NEAR_ZOOM_LIMIT = -50.0; - private final Double FAR_ZOOM_LIMIT = -160.0; + private final Double NEAR_ZOOM_LIMIT = -30.0; + private final Double FAR_ZOOM_LIMIT = -180.0; private Double horizontalPan; private Double verticalPan; @@ -29,7 +29,7 @@ public class IsometricCamera extends PerspectiveCamera implements RaceCamera { super(true); transforms = this.getTransforms(); - zoomFactor = (FAR_ZOOM_LIMIT + NEAR_ZOOM_LIMIT) / 2.0; + zoomFactor = FAR_ZOOM_LIMIT; horizontalPan = cameraStartX; verticalPan = cameraStartY; diff --git a/src/main/java/seng302/visualiser/cameras/TopDownCamera.java b/src/main/java/seng302/visualiser/cameras/TopDownCamera.java index 72d58707..d01decd4 100644 --- a/src/main/java/seng302/visualiser/cameras/TopDownCamera.java +++ b/src/main/java/seng302/visualiser/cameras/TopDownCamera.java @@ -11,9 +11,9 @@ import seng302.visualiser.fxObjects.assets_3D.BoatObject; public class TopDownCamera extends PerspectiveCamera implements RaceCamera { - private final Double PAN_LIMIT = 30.0; - private final Double NEAR_ZOOM_LIMIT = -30.0; - private final Double FAR_ZOOM_LIMIT = -130.0; + private final Double PAN_LIMIT = 40d; + private final Double NEAR_ZOOM_LIMIT = -20.0; + private final Double FAR_ZOOM_LIMIT = -145d; private final Double ZOOM_STEP = 2.5; private ObservableList transforms; diff --git a/src/main/java/seng302/visualiser/fxObjects/Marker.java b/src/main/java/seng302/visualiser/fxObjects/Marker.java new file mode 100644 index 00000000..53dcda32 --- /dev/null +++ b/src/main/java/seng302/visualiser/fxObjects/Marker.java @@ -0,0 +1,38 @@ +package seng302.visualiser.fxObjects; + +import java.util.ArrayList; +import java.util.List; +import javafx.scene.Group; +import seng302.visualiser.fxObjects.MarkArrowFactory.RoundingSide; + +/** + * Created by cir27 on 28/09/17. + */ +public abstract class Marker extends Group{ + + protected List enterArrows = new ArrayList<>(); + protected List exitArrows = new ArrayList<>(); + protected int enterArrowIndex = 0; + protected int exitArrowIndex = 0; + + public abstract void addArrows(RoundingSide roundingSide, double entryAngle, double exitAngle); + /** + * Shows the next EnterArrow. Does nothing if there are no more enter arrows. Other arrows become hidden. + */ + public void showNextEnterArrow() { + showArrow(enterArrows, enterArrowIndex); + enterArrowIndex++; + } + + /** + * Shows the next ExitArrow. Does nothing if there are no more enter arrows. Other arrows become hidden. + */ + public void showNextExitArrow() { + showArrow(exitArrows, exitArrowIndex); + exitArrowIndex++; + } + + protected abstract void showArrow(List arrowList, int arrowListIndex); + + public abstract void hideAllArrows(); +} diff --git a/src/main/java/seng302/visualiser/fxObjects/assets_2D/Marker2D.java b/src/main/java/seng302/visualiser/fxObjects/assets_2D/Marker2D.java index d45b1341..e32023dc 100644 --- a/src/main/java/seng302/visualiser/fxObjects/assets_2D/Marker2D.java +++ b/src/main/java/seng302/visualiser/fxObjects/assets_2D/Marker2D.java @@ -1,6 +1,5 @@ package seng302.visualiser.fxObjects.assets_2D; -import java.util.ArrayList; import java.util.List; import javafx.application.Platform; import javafx.scene.Group; @@ -8,18 +7,15 @@ import javafx.scene.paint.Color; import javafx.scene.paint.Paint; import javafx.scene.shape.Circle; import seng302.visualiser.fxObjects.MarkArrowFactory; +import seng302.visualiser.fxObjects.Marker; /** * Visual object for a mark. Contains a coloured circle and any specified arrows. */ -public class Marker2D extends Group { +public class Marker2D extends Marker { private Circle mark = new Circle(); private Paint colour = Color.BLACK; - private List enterArrows = new ArrayList<>(); - private List exitArrows = new ArrayList<>(); - private int enterArrowIndex = 0; - private int exitArrowIndex = 0; /** * Creates a new Marker containing only a circle. The default colour is black. @@ -79,7 +75,8 @@ public class Marker2D extends Group { exitArrowIndex++; } - private void showArrow(List arrowList, int arrowListIndex) { + @Override + protected void showArrow(List arrowList, int arrowListIndex) { if (arrowListIndex < arrowList.size()) { Platform.runLater(() -> this.getChildren().setAll(mark, arrowList.get(arrowListIndex)) diff --git a/src/main/java/seng302/visualiser/fxObjects/assets_3D/Marker3D.java b/src/main/java/seng302/visualiser/fxObjects/assets_3D/Marker3D.java index 2766edfc..aa2420e1 100644 --- a/src/main/java/seng302/visualiser/fxObjects/assets_3D/Marker3D.java +++ b/src/main/java/seng302/visualiser/fxObjects/assets_3D/Marker3D.java @@ -1,22 +1,17 @@ package seng302.visualiser.fxObjects.assets_3D; - -import java.util.ArrayList; import java.util.List; import javafx.application.Platform; import javafx.scene.Group; import seng302.visualiser.fxObjects.MarkArrowFactory; import seng302.visualiser.fxObjects.MarkArrowFactory.RoundingSide; +import seng302.visualiser.fxObjects.Marker; /** * Visual object for a mark. Contains a coloured circle and any specified arrows. */ -public class Marker3D extends Group { +public class Marker3D extends Marker { private Model mark; - private List enterArrows = new ArrayList<>(); - private List exitArrows = new ArrayList<>(); - private int enterArrowIndex = 0; - private int exitArrowIndex = 0; private ModelType markType; private ModelType arrowType; @@ -60,23 +55,8 @@ public class Marker3D extends Group { ); } - /** - * Shows the next EnterArrow. Does nothing if there are no more enter arrows. Other arrows become hidden. - */ - public void showNextEnterArrow() { - showArrow(enterArrows, enterArrowIndex); - enterArrowIndex++; - } - - /** - * Shows the next ExitArrow. Does nothing if there are no more enter arrows. Other arrows become hidden. - */ - public void showNextExitArrow() { - showArrow(exitArrows, exitArrowIndex); - exitArrowIndex++; - } - - private void showArrow(List arrowList, int arrowListIndex) { + @Override + protected void showArrow(List arrowList, int arrowListIndex) { if (arrowListIndex < arrowList.size()) { Platform.runLater(() -> this.getChildren().setAll(mark.getAssets(), arrowList.get(arrowListIndex)) diff --git a/src/main/resources/meshes/mark_pointer.stl b/src/main/resources/meshes/mark_pointer.stl index be51d3f3..a7bc5099 100644 Binary files a/src/main/resources/meshes/mark_pointer.stl and b/src/main/resources/meshes/mark_pointer.stl differ diff --git a/src/main/resources/meshes/player_circle.stl b/src/main/resources/meshes/player_circle.stl index 5afc2bdd..b91cf5a2 100644 Binary files a/src/main/resources/meshes/player_circle.stl and b/src/main/resources/meshes/player_circle.stl differ